文章目录
- 基本概念
- Mysql数据库软件
- SQL
-
- 什么是SQL?
- SQL通用语法
- DDL 操作数据库,表
- DML 增删改表中数据
- DQL 查表
-
- 语法:
- 基础查询
- 条件查询
- 排序查询
- 聚合函数(列的纵向计算)
- 分组查询
- 分页查询
- 约束
- 多表查询
- 数据库的设计
-
- DCL 用户访问授权
-
基本概念
1.Datea Base 简称DB
2.是用于存储和管理的仓库
3.特点
1.是持久化存储数据的。其实数据库就是一个文件系统
2.方便存储和管理数据
3.使用同一方法操作数据库sql
4.常用数据库
Oracle,Mysql
Mysql数据库软件
1.安装
安装教程:https://blog.csdn.net/y5946/article/details/78434525
2.卸载
1.mysql的安装目录下找my.ini文件
*复制:datadir="C:ProgramData.Mysql/Mysql ....."
2.卸载mysql
3.删除datadir="C:ProgramData/Mysql"文件
3.配置
*Mysql服务启动
1.手动
1.cmd--> services.msc 打开服务器窗口
2.使用管理员身份打开cmd
*net start mysql :启动mysql服务
*net stop mysql :关闭mysql服务
4.登录
1.
cmd-->mysql -uroot -p333
cmd-->mysql -root -p
***
2.cmd-->mysql -hip -uroot -p密码
5.退出
1.exit
2.quit
6.MySQL目录结构
1.安装目录
2.数据目录
SQL
什么是SQL?
Structyred Query Language :结构化查询语言
SQL通用语法
1.SQL 语句可以单行多行书写,以分号结尾
2.可以使用空格和缩进语句可读性
3.注释
单行注释: --空格注释内容
多行注释:/*注释内容*/
DDL 操作数据库,表
1.操作数据库
1.C增
create database 数据库名称;
create database if not exists 数据库名称;
create database if not exists 数据库名称 character set gbk;
2.R查
*show databases;查询所有数据库名称
*show create database 数据库名称;-- 查看某个数据库的创建语句
3.U改
*修改数据库的字符集
*alter database db3 character set utf8;
4.D删
drop database 数据库名称;
drop database if exists 数据库名称;
5.用
use 数据库名称;
select database(); -- 查看当前使用数据库名称
2.操作表
1.C增
1. create table 表名(
列名1 数据类型1,
列名2 数据类型2,
列名3 数据类型3,
列名4 数据类型4
);-- 最后一列不要加逗号
*数据类型
1.int :整型
* age int,
2.double :浮点型
*score double(5,2),
3.date : 日期,只包含年月日,yyyy-MM-dd
4.datatime:日期,还包含时秒分,yyyy-MM-dd HH:mm:ss
5.timestamp:日期,还包含时秒分,yyyy-MM-dd HH:mm:ss
默认使用当前系统时间赋值
6.varchar:字符串
*name varchar(20):姓名最大20个字符
*zhangsan 8个字符 张三 2个字符
2.create table if not exists stu like student; -- 复制
2.R查
1.show tables;-- 查询所有表
2.decs 表名;-- 查询表结构
3.U改
1.修改表名
alter table 表名 rename to 新表名;
2.修改表的字符集
alter table 表名 character set utf8;
3.添加一列
alter table 表名 add 列名 数据类型;
4.修改一列
alter table 表名 change 列名 新列名 新数据类型;
alter table 表名 modify 列名 新数据类型;
3.删除一列
alter table 表名 drop 列名;
4.D删
1.drop table 表名;
2.drop table if exists 表名;
DML 增删改表中数据
1.添加数据
1.insert into 表名(列1,列2,列3....,列n)values(值1,值2,值3 ....,值n);
2.insert into 表名 values(所有值);//不需要写列名,必须把所有列的信息都写上去
3.除了数字类型和NULL其他值都要加引号(单双都行)
2.修改数据
update 表名 set 列名1=值1,列名2=值2,列名3=值3....[where 条件];
-- 如果不加where会将表中数据全部修改!!!
3.删除数据
1.delete from 表名 where 条件;
***注意
一定要写where!!!!!
2.如果要删除所有记录
truncate table 表名;-- 先删除表,然后再创建一张一样的表
DQL 查表
语法:
select
字段列表
from
表名
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
基础查询
1.多个字段的查询
select 字段名1,字段名2.... from 表名;
*注意
*字段名可以省略,表示查询所有字段
2.去除重复
在select后加distinct
3.计算列
*一般可以进行字段之间的四则运算(一般只会进行数值的运算)
*ifnull(表达式1,表达式2):null参与的运算,计算结果的都为null
*表达式一:那个字段需要判断是否为null
*如果该字段为null后的替换值
4.起别名
在字段后加 as 别名
*as可以省略
条件查询
1. where字句后边跟条件
2. 运算符
* >,<,=,>=,<=,<>(不等于)
* between...and
* in(集合)-- 在集合之中
where age in(1,2,3,4,5);
* like模糊查询
占位符:
%代表多个任意字符
_代表任意一个字符
select * from student where name like '%德%';
* and 或&&
* or 或 ||
* not 或 !
排序查询
order by 排序字段 排序方式(默认为asc升序),排序方式(默认为asc升序);
*asc 升序,desc降序
*如果有多个排序条件,只有当前面排序条件数值一样时,才会判断后边的条件
聚合函数(列的纵向计算)
1.count:计算个数
2.min:最小值
3.max:最大值
4.sum:总和
5.avg:平均值
*聚合函数会排除null
解决方案:写主键,用ifnull
分组查询
group by 分组字段名
*注意分组后查询的字段只能写:分组的字段,聚合函数。要不没有意义
分页查询
limit 开始的页数,每页查询的页数; (mysql方言)
公式:开始的索引=(开始的页码-1)*每一页显示的条数;
limit是mysql的方言
约束
1.主键约束primary key
*特点:唯一,非空,一个表只能有一个
1.创建表时加主键
在要加主键的字段后加 primary key 即可
2.创建表之后删除主键
alter table 表名 drop primary key;
3.创建表后加主键
alter table 表名 modify 字段名 数据类型 primary key;
2.主键自增长
在添加主键时在后面加 auto_increment就行了
删除自增长:alter table 表名 int 数据类型;
2.非空约束not null
1.创建表时加非空约束
在要加约束的字段后加 not null 即可
2.创建表之后删除约束
alter table 表名 字段名 数据类型;
3.创建表后加约束
alter table 表名 modify 字段名 数据类型 not null;
3.唯一约束unique(mysql中两个null不属于一样的)
1.创建表时加约束
在要加逐渐的字段后加 unique 即可
2.创建表之后删除约束
alter table 表名 drop index 字段名;
3.创建表后加约束
alter table 表名 modify 字段名 数据类型 unique;
4.外键约束foreign key
注意
1: 该表外键不能为该表的主键(primary key)
2:参照建必须为参照表的主键
3:子表和父表的数据类型必须完全一致,
特点:
*用于连接别的表,解决表内数据冗余的问题
*这个表中对应数据不删除,连接的表对应数
据不能删除。
1.创建表的时候加外键约束
constraint 外键名 foreign key(外键字段)references 要链接的表的名称(字段名)
2.创建表后删除外键
alter table 表名 drop foreign key 外键名;
3.创建表后添加外键
alter table 表名 add constraint 外键名 foreign key(外键字段)references 要
链接的表名(字段名);
4.级联操作
1.添加级联操作
alter table 表名 add constraint 外键名称 foreign key (字段名称)
references 主表名称(主表字段名称) on update cascade on delete cascade
2.分类:
1.级联更新:on update cascade
2.级联删除:on delete cascade
多表查询
*查询语法
select 列名列表 from 表名 wherer 条件 group by 分组字段名 having 条件 order by 字段名
顺序 limit 数,数 ;
*笛卡尔积:
*有两个集合A,B 取这两个集合主所有组成情况。
*要完成多表查询,需要消除无用的数据
*多表查询的分类
1.内连接查询
1.隐式内连接:使用where条件消除无用数据
2.显示内连接:
select 字段列表 from 表名1 [inner] join 表名2 on 条件 ;
2.外连接查询
1.左外连接查询
select 字段列表 from 表名1 [outer] left join 表名2 on 条件 ; -- 保留左表所有条件
2.右外连接查询
select 字段列表 from 表名1 [inner] right join 表名2 on 条件 ;--保留右表文件
1.子查询
* 概念:查询中嵌套查询,称嵌套查询为子查询。
*子查询不同情况
1.子查询结果是单行单列的:
*子查询结果可以看作一个值,进行比较
-- 查询员工工资小于平均工资的人
SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);
2.子查询是多行单列的:
*子查询可看作一列数写道in()里面
-- 查询'财务部'和'市场部'所有的员工信息
SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME =
'财务部' OR NAME = '市场部');
3.子查询的多行多列的
*子查询可看成一个新的表虚拟表用于查询
-- 查询员工入职日期是2011-11-11日之后的员工信息和部门信息
SELECT * FROM dept t1 ,(SELECT * FROM emp WHERE emp.`join_date` >
'2011-11-11') t2 WHERE t1.id = t2.dept_id;
数据库的设计
多表之间的关系
1.一对一(了解,开发很少存在):
*如:人和身份证
*分析:一个人只有一个身份证,一个身份证只能对应一个人
2.一对多(多对一):
*如:员工和部门
*分析:一个员工只对应一个部门,一个部门对应许多员工
3.多对多:
*如:学生和课程
*分析:一个学生可以对应多门课程,一门课程对应多个学生
事务
1.事务的基本介绍
1.概念:
* 如果一个包含多个步骤的操作,被事务管理,那么这些操作要么同时成功,要么同时失败
2.操作
1.开启事务:setart transaction;
2.回滚事务:rollback;
3.提交: commit;
3.MySQL数据库中事务默认自动提交
*事务提交的两种方式
*自动提交
*mysql就是自动提交的
*一条dml(增删改)语句提交一次
*手动提交
*oracle的数据库是手动提交的
*需要先开启事务再提交
*修改事务默认提交方式
*查看事务的默认提交方式:select @@autocommit; -- 1代表自动提交,-- 0代表手动提交
*更改事务的默认提交方式:set @@autocommit =1/0;
2.事务的四大特征(面试经常有)
1.原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败
2.持久性:当事务提交或回滚后,数据库会持久化的保存数据
3.隔离性:多个事物之间,相互独立。
4.一致性:实务操作前后,数据总量不变
3.事务的隔离级别(了解)
*概念
多个事物之间是隔离的,相互独立的。但如果多个事务操作同一批数据,则会引发一些问题,设置不
同的隔离级别就能解决这些问题。
*存在问题:
1.脏读:一个事务读到另一个事务中没有提交的数据
2.不可重复读:在同一事务中,两次读到的数据不一样
3.幻读:一个事务操作dml数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到
自己的修改
*隔离级别
1.read uncommitted:读未提交
出现问题:脏读、不可重复读、幻读
2.read committed:读已提交(oracle)
出现问题:不可重复读、幻读
3.repeatable read:可重复的(mysql)
出现问题:幻读
4.serializable:串行化
没有问题
*级别越高,越安全,效率越低
*查询/设置隔离级别
select @@tx_isolation;-- 查询
set global transaction isolation level 级别字符串; -- 更改
数据库三范式
*概念:要遵循后边的范式,必须先遵顼前边的所有范式。
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求
被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小,目前关系数据库有六
种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)
、第四范式(4NF)和第五范式(5NF,又称完美范式)。
摘自百度百科:https://baike.baidu.com/item/数据库范式/7309898
*三范式
1.第一范式:
每一列都是不可被分割的原子数据项
2.第二范式:
在第一范式的基础上,非码属性必须完全依赖于码(在范式一的基础上消除非主属性对
主码的部分函数依赖)
3.第三范式:
在第二范式的基础上,任何非主属性吗不依赖于其他非主属性(在范式二的基础上消除
传递依赖)
*注意:只要满足前三范式,数据库结构基本就是很好的。
*几个概念
1.函数依赖:A->B,如果通过A属性:属性组:的值,可以确定唯一B属性的值,则称B依赖于A
2.完全依赖:A->B,如果A属性组,B属性要得以确定需要A族中所有属性值
3.部分函数依赖:A->,如果A是一个属性组,B属性值的以确定只需要依赖于A中某些值
4.传递函数依赖:A-->B,B->C,B依赖于A,C依赖于B,则称C传递函数依赖于A
5.码:如果在一张表中,一个属性或属性组,被所有其他属性所完全依赖,则称这个属
性或属性组为这张表的码
DCL 用户访问授权
用途:管理用户,授权
1.管理用户
1.添加用户:
create user '用户名' @ '主机名' identified by '密码';
create user '用户名' @ '%' identified by '密码';
2.删除用户:
drop user '用户名' @'主机名';
3.修改用户密码:
1.update user set password=password(密码) where user='用户名';
2.set password for 'root'@'localhost'=password('123');
*当忘记mysql中的密码时:
1.cmd --> net stop mysql 停止mysql服务
*需要管理员运行cmd
2.使用五验证方式启动mysql服务:mysqld --skip-grant-tables
3.打开新的cmd窗口,直接输入mysql命令,回车。就可以登陆
4.use mysql;
5.update user set password =password('新密码') where user ='root';
6.关闭两个窗口
7.打开任务管理器,手动节输mysqld.exe 的进程
8.启动mysql服务
9.使用新的密码登录
4.查询用户:
-- 1.切换到mysql数据库
use mysql;
-- 2.查询user表
select * from user;
%通配符:表示任意字符
5.权限管理
1.查询权限
show grants for '用户名'@'主机名';
2.授予权限
1.grant 权限列表 on 数据库名.表名 to '用户名' @ '主机名’;
2.grant all on *.* to '用户名'@'主机名'; -- 给这个用户所有权限
3.收回权限
1.revoke 权限列表 on 数据库名.表名from '用户名'@'主机名';