2020-11-2-MySQL笔记

文章目录

  • 基本概念
  • 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 '用户名'@'主机名';

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