数据库
1.MySQL安装,卸载
1.数据库的基本概念
- 英文:DataBase ,简称 DB
- 含义:用于存储和管理数据的仓库。
- 特点:持久化存储数据; 方便存储和管理数据;使用统一方式操作数据库(SQL);
2.安装MYSQL
1.点击https://dev.mysql.com/downloads/mysql/
出现以上界面后,选择一个下载,之后按照提示一步步安装。最后在高级设置里配置环境变量。
把存储MYSQL的路径输入,点击确定即可。然后打开命令行,输入mysql -uroot -p,再输入你设置的密码,出现以下界面,说明安装成功。
3.MySQL的卸载
- 卸载MySQL
- 删除C:/ProgramData目录下的MySQL文件夹。(注:ProgramData是隐藏文件夹,需在搜索框中搜索)
4.MySQL服务的启动
1.使用管理员打开cmd
- net start mysql 打开MySQL服务
- net stop mysql 关闭MySQL服务
5.MySQL的登陆和退出
登录: 打开命令行,输入mysql -uroot -p 密码
退出:1.exit 2.quit
MySQL结构
2.SQL
1.SQL含义:定义了操作所有关系型数据库的规则。
2.SQL通用语法
①可以单行或多行书写,以分号结尾。
②可使用空格和缩进来增强语句可读性
③语句不区分大小写,关键字建议用大写。
④注释
1.单行注释 - - 注释内容 或 #注释内容
2.多行注释 /* 注释 */
SQL分类
1.DDl (操作数据库,表)
2.DML (增删改表中的数据)
3.DQL (查询表中的数据)
4.DCL (授权)
DDL :操作数据库,表
3.DDL (操作数据库,表)
1.操作数据库
①Create 创建
-
创建数据库 create database 数据库名称;
-
判断数据库是否存在,并创建 create database if not exists 名称;
-
创建数据库,并指定字符集(jbk) create database 名称 character set 字符集
②Retrieve 查询
-
查询所有数据库的名称 show databases;
-
查询某个数据库的创建语句(如utf8,jbk) show create database;
③Update 修改
- 修改数据库的字符集 alter database 数据库名称 character set 字符集名称;
④Delete 删除
-
删除数据库 drop databases 数据库名称;
-
判断数据库是否存在,存在再删除 drop database if exists 数据库名称;
⑤使用数据库
- 查询正在使用的数据库名称 selete database();
- 使用数据库 use 数据库名称;
2.操作表
①Create 创建
创建一个表
create table 表名称 (
列名1 数据类型1,
列名2 数据类型2,
...
列名n 数据类型n);
**数据类型**
1.int 整数类型
*age int
2.double 小数类型
*score double(5,2) 5代表几位数,2代表几位小数
3.data 日期 只包含年月日
4.datatime 日期 ,包含年月日,时分秒
5.timestamp 时间错类型 包含年月日,时分秒 (如果不给这个字段赋值,默认使用当前系统时间,来自动赋值。
6.varchar 字符串
*name varchar(20) 20代表字符数
文章末尾附有数据类型表格
创建表实例:
create table student(
id int,
name varchar(32),
age int,
score double(4,1),
birthday date,
inserttime timestamp);
复制表:create table 表名 like 被复制的表名;
②Retrieve 查询
- 查询某个数据库的所有表名称 show tables;
- 查询表结构 desc 表名称
③Update 修改
-
修改表名 alter table 表名 rename to 新表名;
-
修改表的字符集 alter table 表名 character set 字符集名称;
-
添加一列 alter table 表名 add 列名 数据类型;
-
修改列名称 ,类型
-
alter table 表名 change 列名 新列名 新数据类型;
-
alter table 表名 modifi 列名 新数据类型;
-
删除列 alter table 表名 drop 列名;
④Delete 删除
- drop table 表名;
- drop table if exists 表名;
4.DMl 增删改表中数据
1.添加数据
- insert into 表名 (列名1,列名2…,列名n) values(值1,值2,值3…,值n);
注意:
1.列名和值要一一对应
2.如果不定义列名,则默认给所有列添加值
insert into 表名 values (值1,值2,值3…,值n);
3.除了数字类型,其它类型的值都需要用引号括起来
2.删除数据
- delete from 表名 where 条件;
注意:
1.如果不加条件,则删除表中所有数据
2.删除表中所有数据 truncate table 表名; – 删除表,再创建一个新表
3.修改数据
- updata 表名 set 列名 1=值1,列名2=值2…,where 条件;
注意: 如果不加条件,则会将表中数据全部修改。
数据类型
5.DQL(查询表中数据)
1.查询
1.通用查询
selete 字段列表 from 表名列表 where 条件 group by 分组字段 having 分组之后的条件 order by 排序 limit 分页限定;
2.基础查询
①多个字段的查询
select 列名1,列名2… from 表名;
注意:如果查询所有字段,可以用*来代替列表名。
②去除重复
select distinct 列名1,列名2… from 表名;
③计算列
select 列名1,列名2(数字类型),列名3(数字类型),列名2+列名3 from 表名;
如果数字类型中出现null时,只需:
SELECT NAME,math,english,math+ IFNULL(english,0) FROM student3;
④起别名
select 列名1 as 别名 ,列名2 as 别名 … from 表名;
3.条件查询
①where 字句后跟条件
②运算符
-
<,>,<=,>=,=,<>
示例: SELECT * FROM student3 WHERE age >20; -
between … and
示例: SELECT * FROM student3 WHERE age BETWEEN 20 AND 30; -
in(集合)
示例:SELECT * FROM student3 WHERE age IN (18,22,25); -
like :模糊查询
占位符: ——:单个任意字符
%:多个任意字符
示例: – 查询姓名中包含马的人 SELECT * FROM student3 WHERE NAME LIKE ‘%马%’; -
is null , is not null
示例: SELECT * FROM student3 WHERE english IS NOT NULL; -
and ,&&
示例:SELECT * FROM student3 WHERE age >=20 && age <=30;
SELECT * FROM student3 WHERE age >=20 AND age <=30; -
or ,||
示例: SELECT * FROM student3 WHERE age =18 OR age =22 OR age =25; -
not , !
示例:SELECT * FROM student3 WHERE age !=55;
4.高级查询
①排序查询
-
order by 排序字段1 排序方式1, 排序字段2 排序方式2…;
-
排序方式
-
ASC:升序,默认的
-
DESC:降序
-
②聚合函数:将一列数据作为一个整体,进行纵向计算。
-
count 计算个数
-
max 计算最大值
-
min 计算最小值
-
sum 计算和
-
avg 计算平均值
注意:聚合函数的计算,会排除null值。
③分组查询
-
order by 分组字段
注意 : -
分组之后查询的字段:分组字段,聚合函数
SELECT sex,AVG(math) FROM student3 GROUP BY sex; -
where 和 having 的区别?
- where在分组之前进行限定,如果不满足条件,则不参与分组。having 在分组之后进行限定,如果不满足条件,则不会被查询出来。
- where 后不可以跟聚合函数,而having可以。
④分页查询
1. limit 开始的索引,每页查询的条数;
2. 公式: 开始的索引=(当前页码-1)*每页显示的条数
约束
-
含义:对表中数据进行限定,保证数据的正确性,有效性和完整性。
-
分类:
-
主键约束:primary key
-
非空约束:not null
-
唯一约束:unique
-
外键约束:foreign key
-
非空约束
-
含义:某一列的值不能为null
-
创建表时添加约束
CREATE TABLE stu ( id INT, NAME VARCHAR(20) NOT NULL -- name为非空 );
-
创建表后添加非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
-
删除非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20);
唯一约束
-
含义:某一列的值不能重复
-
唯一约束可以有null值,但只能有一个
-
创建表时添加唯一约束
CREATE TABLE stu (id INT , phone_number VARCHAR(20) UNIQUE -- 唯一约束 );
-
删除唯一约束
ALTER TABLE stu DROP INDEX phone_number;
-
创建表后添加唯一约束
ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;
主键约束
-
含义:非空且唯一,主键就是表中记录的唯一标识(如 id,身份证号)
-
一张表中只能有一列为主键
-
创建表时添加主键约束
CREATE TABLE stu (id INT PRIMARY KEY, -- 主键约束 NAME VARCHAR(20) );
-
删除主键
ALTER TABLE stu DROP PRIMARY KEY;
-
创建表后添加主键约束
ALTER TABLE stu MODIFY id INT PRIMARY KEY;
自动增长
-
概念:如果某一列是数值类型的,使用 auto_increment 关键字 可以使值自动增长。一般配合 int 类型的主键约束来使用。
-
创建表时添加主键约束,并完成主键自动增长
CREATE TABLE stu (id INT PRIMARY KEY auto_increment, -- 主键约束 NAME VARCHAR(20) );
-
删除自动增长
alter table stu modify id int;
-
添加自动增长
alter table stu modify id int auto_increment;
外键约束
-
让两个表产生关系,从而保证数据的正确性。
-
创建表时,添加外键
create table stu ( ....... 外键列, constraint 外键名称(随便取) foreign key (外键列名称) references 主表名称(主表列名称) );
-
删除外键
alter table 表名 drop foreign key 外键名称;
-
创建表后,添加外键,并设置级联更新(主表列改变后,外键列随之改变),设置级联删除
alter table 表名 add constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)on update cascade on delete cascade;
级联操作
-
设置级联更新
alter table 表名 add constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)on update cascade;
-
设置级联删除
alter table 表名 add constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称) on delete cascade;
6.数据库的设计
1.多表之间的关系
①分类
-
一对一
-
一对多(多对一)
示例:部门——员工 -
多对多
示例:学生——课程
②实现关系
-
一对多实现方式:在多的一方建立外键,指向一的一方的主键
-
多对多的实现方式:需要借助第三张中间表。中间表至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键。
第三张表如图所示
-
一对一实现方式:可以在任意一方添加唯一外键指向另一方的主键。
2.数据库设计范式
①概念:设计数据库时,需要遵循的一些规范。(要遵循后边的范式,必须先遵循前边的范式)
②分类:-
第一范式(1NF):每一列都是不可分割的原子数据项
-
第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
-
第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
几个概念
- 函数依赖:A–>B,如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A。
例如:学号–>姓名, 学号,课程名称–>成绩 - 完全函数依赖:A–>B,如果A是一个属性组,则B属性值的确定需要依赖于A属性组中的所有值。
- 部分函数依赖:A–>B,如果A是一个属性组,则B属性值的确定只需要依赖于A属性组中的部分值。
- 传递函数依赖:A–>B,B–>C,如果通过A属性(属性组)的值可以确定唯一B属性的值,再通过B属性(属性组)确定唯一C属性的值,则称C传递函数依赖于A。
- 码:如果在一张表中,一个属性(属性组)被其它所属性(属性组)所完全依赖,则称这个属性(属性组)为该表的码。
- 主属性:码属性组中的所有属性
- 非主属性:除码属性组中的所有属性
- 函数依赖:A–>B,如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A。
-
3.数据库的备份和还原
1.命令行
备份语法:mysqldump -u用户名 -p密码 数据库名称 > 保存的路径
还原:
1.登录数据库
2.创建数据库
3.使用数据库
4.执行文件 语法: source 文件路径
2.图形化工具
https://b23.tv/obWltk,到此网址自行查看。
7.多表查询
笛卡尔积
概念:存在两个集合A和B,取这两个集合的所有组成情况。注:要完成多表查询,需删除无用的数据
1.内连接查询
①隐式内连接:使用where条件消除无用数据
select 字段列表 from 表1,表2 where 条件;
②显示内链接
select 字段列表 form 表名1 inner join 表名2 on 条件;(inner可省略)
2.外连接查询
①左外连接:查询左边所有数据以及交集部分。 (交集由on 后边的条件决定)
select 字段列表 from 表1 left outer join 表2 on 条件; (outer 可省略)
②右外连接:查询右边所有数据以及交集部分。 (交集由on 后边的条件决定)
select 字段列表 from 表1 right outer join 表2 on 条件; (outer 可省略)
3.子查询
①概念:查询中嵌套查询,称嵌套查询为子查询
②子查询的不同情况
-
子查询的结果是单行单列的
子查询可以作为条件,使用运算符去判断。 运算符:>,>=,<,<=,= …select * from emp where emp.salary <(select avg(salary) from emp);
-
子查询的结果是多行单列的
子查询可以作为条件,使用运算符去判断。 运算符:in ; -
子查询的结果是多行多列的
子查询可以作为一张虚拟表参与查询。select * from dept as t1,(select * from where emp.age>18)as t2 where t1.id=t2.dept_id;
8.事务
1.事务的基本介绍
①概念:如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
②操作:
-
开启事务:strat transaction;
-
回滚: rollback;
-
提交:commmit;
③MySQL数据库中事务默认自动提交
-
事务提交的两种方式
-
自动提交:一条DML(增删改)语句会自动提交一次事务。
-
手动提交:需先开启事务,再提交。(如果没有提交,则数据不会永久性保存)
-
-
修改事务默认提交方式
- 查看事务默认提交方式: select @@autocommit ; – 1代表自动提交 0 代表手动提交
- 修改事务默认提交方式: set @@autocommit = 0;
2.事物的四大特征
- 原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败
- 持久性:当事务提交或回滚后,数据库会持久化的保存事务。
- 隔离性:多个事务之间相互独立。
- 一致性:事务操作前后,数据总量不变。
9.DCL(控制权限和管理用户)
1.管理用户
①添加用户
语法:create user ‘用户名’ @ ‘主机名’ identified by ‘密码’;
②删除用户
语法:drop user ‘用户名’ @ ‘主机名’ ;
③修改用户密码
语法1:updata user set password =password(‘新密码’) where user =‘用户名’ ;
语法2:set password for ‘用户名’ @ ‘主机名’ =password('新密码’) ;
mysql中忘记了root用户的密码?
- cmd–> net stop mysql停止mysql服务(需要管理员运行该cmd)
- 使用无验证方式启动mysql服务:mysqld–skip-grant-tables
- 打开新的cmd窗口,直接输入mysql命令,敲回车。就可以登录成功。
- 修改用户密码
- 关闭两个窗口
- 打开任务管理器,手动结束mysqld.exe 的进程。
- 启动mysql服务
- 使用新密码登陆
④查询用户
- 切换到mysql数据库: use mysql;
- 查询user表: select * from user;
2.权限管理
- 查询权限
语法:SHOW GRANTS FOR ‘用户名’ @‘主机名’ ; - 授予权限
语法:grant 权限列表 on 数据库名.表名 to ‘用户名’@‘主机名’ ; - 撤销权限
语法:revoke 权限列表 on 数据库名.表名 from ‘用户名’@‘主机名’ ;