MySQL

一、MySQL基础

SQL

1. SQL简介
Structured Query Language:结构化查询语言
2. SQL通用语法
1. SQL语句可以单行或多行书写
2. 可使用空格和缩进来增强语句的可读性
3. MySQL数据的SQL语句不区分大小写,关键字建议使用大写
4. 3种注释:
		单行注释: *-- 注释内容*	或	*# 注释内容*
		多行注释: /*注释*/
3. SQL分类
1. DDL(Data Definition Language)数据定义信息
	用来定义数据库对象:数据库,表,列等。关键字:create,drop,alter等
2. DML(Data Manipulation Language)数据操作语言
	用来对数据库中表的数据进行增删改。关键字:insert,delete,update等
3. DQL(Data Query Language)数据查询语言
	用来查询数据库中表的记录(数据)。关键字:select,where等
4. DCL(Data Control Language)数据控制语言(了解)
	用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT,REVOKE等

DDL 操作数据库、表

1. 操作数据库:
	1. create:创建
		CREATE DATABASE [ IF NOT EXISTS ] 数据库名称 [ CHARACTER SET GBK ];	
	2. retrieve:查询
		* 查询所有数据的名称:SHOW DATABASES;
		* 查看某个数据库的字符集:SHOW CREATE DATABASE 数据库名称;
	3. update:修改
		* 修改数据库的字符集:ALTER DATABASE 数据库名称 CHARACTER SET UTF8;
	4. delete:删除
		* 删除数据库:DROP DATABASE [ IF EXISTS ] 数据库名称;
	5. 使用数据库
		* 查询当前正在使用的数据库名称:SELECT DATABASE();
		* 使用数据库:USE 数据库名称;
2. 操作表
  1. create:创建

     1. 复制表:CREATE TABLE 新表名 LIKE 被复制的表名;
     2. 创建表:CREATE  TABLE 表名(列名1 数据类型1, 列名2 数据类型2,...列名n 数据类型n);
     3. 数据类型:
     			* int:整数类型。 # age int
     			* double:小数类型。 #score double(5,2)
     			* date:日期,只包含年月日,yyyy-MM--dd
     			* datetime:日期,包含年月日时分秒,yyyy-MM-dd HH-mm-ss
     			* timestamp:时间错类型,包含年月日时分秒, yyyy-MM-dd HH-mm-ss。
     						  如果不给这个字符赋值,默认会使用系统时间。
     			* varchar:字符串
    
  2. retrieve:查询

     1. 查询某个数据库中所有的表名称:SHOW TABLES;
     2. 查询表结构:DESC 表名;
    
  3. update:修改

     1. 修改表名:ALTER TABLE 表名 RENAME TO 新的表名;
     2. 修改表的字符集:ALTER TABLE 表名 CHARACTER SET 字符集名称;
     3. 添加一列:ALTER TABLE 表名 ADD 列名 数据类型;
     4. 修改列名称 类型:ALTER ALTER TABLE 表名 CHANGE 列名 新的列名 新的数据类型;
     	ALTER TABLE 表名 MODIFY 列名 新的数据类型;
     5. 删除列:ALTER TABLE 表名 DROP 列名;
    
  4. delete:删除

     DROP TABLE [ IF EXISTS ] 表名;
    

DML:增删改表中数据

1. 添加数据:
INSERT INTO 表名(列名1, 列名2,..., 列名n) VALUES (数据1,数据2,...,数据n);
注意:
		1.列名和值要一一对应。
		2.省略列名后VALUES要给所有值。
		3.除了数字类型,其他类型需要使用引号 
2. 删除数据
* DELETE FROM 表名 [ WHERE 条件 ];
* 注意:
		1.如果不加条件,会删除表中所有记录;
		2.如果要删除所有记录:
			* DELETE FROM 表名;	-- 不推荐。有多少条记录就会执行多少次删除操作
			* TRUNCATE TABLE 表名; 	-- 推荐使用。删除表,然后创建一张一样的表
3. 修改数据
* UPDATE 表名 SET 列名1 = 值1, 列名2 = 值2, ...[ WHERE条件 ]
* 注意:如果不加任何条件,则会将表中所有记录全部修改。

DQL:查询表中的记录

	查询:SELECT [ DISTINCT ] 字段列表 FROM 表名列表 [ WHERE 条件列表 ] [ GRUOP BY 分组字段 ] [ HAVING 分组之后的条件 ][ ORDER BY 排序 ][ LIMIT 分页限定 ];

	基础查询:
			1. 多个字段的查询
				SELECT 字段名1, 字段名2..., FROM 表名;
			2. 去除重复
				DISTINCT
			3. 计算列
				* 一般可以使用四则运算计算一些列的值。
				* IFNULL(表达式1,表达式2)
			4. 起别名
				* AS:AS可以省略
	条件查询
			1. WHERE子句后跟条件
			2. 运算符
				* >, <, <=, >=, =, <>或 !=
				* BETWEEN...AND
				* IN( 集合)
				* LIKE:模糊查询
						* 占位符:1. _:单个任意字符; 	2.%:多个任意字符
				* IS NULL
				* AND 或 &&
				* OR 或 ||
				* NOT 或 !
1. 排序查询
  • 语法:order by 子句
  • 排序方式:ASC 升序,DESC 降序
  • 注意:如果有多个排序条件,则当前面的条件值一样,才会根据其后的条件排序
2. 聚合函数:将一列数据作为一个整体,进行纵向的计算
* COUNT:计算个数
* MAX:计算最大值
* MIN:计算最小值
* SUM:计算和
* AVG:计算平均值
**注意**:聚合函数不会计入为NULL的值

解决方案:
	1.选择不包含非空的列进行计算:主键		
	2.IFNULL函数
3. 分组查询
* 语法:GROUP BY 分组字段;
* 注意:
	1. 分组之后查询的字段:分组字段、聚合函数  
	2. WHERE 和 HAVING 的区别:
* WHERE 在分组之前进行限定,如果不满足条件,则不参与分组。HAVING在分组之后进行限定,如果不满足条件,则不会被查询出来
* WHERE 后不可以跟聚合函数,HAVING可以进行聚合函数的判断
4. 分页查询
* 语法: LIMIT 开始的索引,每页显示的条数
* 公式:开始的索引=(当前的页码-1)*每页显示的条数
* MySQL数据库用LIMIT,Oracle数据库分页用Rownum

DCL 用户管理(了解)

1. 管理用户
	1. 添加用户
		create user '用户名'@'主机名' identified by '密码'
	2. 删除用户
		drop user '用户名'@'主机名';
	3. 修改用户密码
		1. update user set password = password('新密码') where user= '用户名';
		2. set password for '用户名'@'主机名' = password('新密码');
	4. 查询用户
		1. 切换到 mysql 数据库
		2. 查询 user 表
	* 通配符:%表示在任意主机使用用户登录数据库。 
	
	* 忘记root账号密码操作:
		1. 使用管理员模式开启cmd,停止mysql服务
		2. 使用无验证方式启动mysql服务:mysqld --skip-grant-tables
		3. 打开新的cmd窗口,直接输入mysql回车就可以登录
		4. use mysql 然后 update user password = password('新密码') where user = 'root';
		5. 关闭两个cmd 窗口,然后在任务管理器中手动结束 mysqld.exe 的进程
		6. 关闭两个窗口
		7. 启动 mysql 服务,使用新密码登录
2. 授权
1. 查询权限
	show grants for '用户名'@'主机名';
2. 授予权限
	grant 权限列表 on 数据库名.表名 to  '用户名'@'主机名';
3. 撤销权限
	revoke 权限列表 on 数据库名.表名 from '用户名'@‘主机名’;

二、约束

  1. 概念:对表中的数据进行限定,保证数据的正确性、有效性和完整性。

  2. 分类:

     * 主键约束:PRIMARY KEY
     * 非空约束:NOT NULL
     * 唯一约束:UNIQUE
     * 外键约束:FOREIGN KEY
    
非空约束:NOT NULL
	1. 创建表时添加约束
	CREATE TABLE stu(
			id INT,
			NAME VARCHAR(20) NOT NULL
	);
	2. 创建表完后,添加非空约束
	ALTER TABLE 表名 MODIFY NAME VARCHAR(20) NOT NULL;
	3. 删除NAME的非空约束
	ALTER TABLE 表名 MODIFY NAME VARCHAR(20);
唯一约束:UNIQUE
注意:唯一约束限定的值可以为多个NULL值
	1. 创建表时添加唯一约束
	CREATE TABLE 表名 (
			id INT,
			phone_number VARCHAR(20) UNIQUE
	);
	2. 创建表后添加唯一约束
	ALTER TABLE 表名 MODIFY phone_number VARCHAR(20) UNIQUE;
	3. 删除唯一约束
	ALTER TABLE 表名 DROP INDEX phone_number;
主键约束:PRIMARY KEY
	* 注意:
			1. 含义:非空且唯一
			2. 一张表只能有一个字段为主键
			3. 主键就是表中记录的唯一标识
	* 在创建表时,添加主键约束
		CREATE TABLE 表名 (
				id INT PRIMARY KEY,
				NAME VARCHAR(20)
		);
	* 创建完表后添加主键
		ALTER TABLE 表名 MODIFY id INT PRIMARY KEY;
		ALTER TABLE 表名 ADD PRIMARY KEY id;
	* 删除主键
		ALTER TABLE 表名 DROP PRIMARY KEY;
	* 自动增长:
			1. 如果某一列是数值类型的,使用AUTO_INCREMENT可以完成数值的自动增长
			2. 在创建表时,添加主键约束,并且完成主键自动增长
				CREATE TABLE 表名 (
						id INT PRIMARY KEY AUTO_INCREMENT,
						NAME VARCHAR(20)
				);
			3. 删除自动增长
				ALTER TABLE 表名 MODIFY id INT;
			4. 添加自动增长
				ALTER TABLE 表名 MODIFY id INT AUTO_INCREMENT;
外键约束:FOREIGN KEY,让表与表产生关系,从而保证数据的正确性。
			1. 在创建表时添加外键
				CREATE TABLE 表名(
						...
						外键列
						CONSTRAINT 外键名称 FOREIGN KEY (外键列名称) REFERENCES 主表名称(主表列名称)
				);
			2. 创建表之后添加外键
				ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键列名称) REFERENCES 主表名称(主表列名称);
			3. 删除外键
				ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
			4. 级联操作
					1. 级联更新:ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键列名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE;
					2. 级联删除:ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键列名称) REFERENCES 主表名称(主表列名称) ON DELETE CASCADE;

三、数据库的设计

1. 多表之间的关系

1.分类
1. 一对一(了解) 
2. 一对多或多对一
3. 多对多
2. 实现方式
1. 一对多:多的外键指向一的主键
2. 多对多:多对多关系实现需要借助第三张中间表,中间表至少包含两张主表的主键这两个字段,这两个字段作为中间表的外键分别指向两张表的主键。
3. 一对一:任意一方添加唯一外键指向另一方的主键

2. 数据库设计的范式

分类:

第一范式:每一列都是不可分割的原子数据项
第二范式:在第一范式的基础上,非码属性必须完全依赖(在第一范式的基础上消除非主属性对主码的部分函数依赖
第三范式:在第二范式的基础上,任何非主属性不依赖于其他非主属性(在第二范式的基础上消除传递依赖

名字解释
  1. 函数依赖:如果通过A属性(属性组)的值,可以确定唯一B属性的值,则称B依赖于A。
  2. 完全函数依赖:如果A是一个属性组,而B属性的确定需要A属性组中所有的属性值,则称B完全依赖于A。
  3. 部分函数依赖:如果A是一个属性组,而B属性的确定只需要A属性组中某一部分属性值,则称B部分依赖于A。
  4. 传递函数依赖:如果通过A属性(属性组)的值,可以确定唯一B属性的值,而通过B属性的值可以确定唯一C属性的值,则A与C之间就是传递依赖。
  5. :如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码。

3. 数据库的备份与还原

  1. 命令行:

     备份语法: mysqldump -u用户名 -p密码 数据库名称 > 保存的路径
     还原语法: 
     		1. 登录数据库
     		2. 创建数据库
     		3. 使用数据库
     		4. 执行文件:source 文件路径
    
  2. 图形化工具

四、 多表查询

1. 分类:
1. 内连接查询:
	* 隐式内连接:使用where条件消除无用数据
				select * from emp, dept where emp.deptno = dept.deptno;
	* 显示内连接:使用 inner join 实现内连接
				select * from emp [inner] join dept on emp.deptno = dept.deptno;
2. 外连接查询:
	* 左外连接:
				select * from emp left [outer]  join dept on emp.deptno = dept.deptno;
	* 右外连接:
				select * from emp right [outer] join dept on emp.deptno = emp.deptno;
3. 子查询:
	概念:查询中嵌套查询,称嵌套查询为子查询。
	子查询的不同情况:
		1. 子查询的结果是单行单列的;
			* 子查询可以作为条件,使用运算符去判断。
		2. 子查询的结果是多行单列的;
			* 子查询可以作为条件,使用运算符in来判断
		3. 子查询的结果是多行多列的;
			* 可以作为一张虚拟表

五、 事务

  1. 基本介绍

     1. 概念
     	* 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,
     要么同时失败
     2. 操作:
     	1. 开启事务:start transaction;
     	2. 回滚:rollback;
     	3. 提交:commit;
     	4. MySQL数据库中事务默认提交
     		1. 事务提交的两种方式:
     			* 自动提交:
     				*	 MySQL是自动提交的
     				*	一条DML语句就会自动提交一次事务
     			* 手动提交:
     				* Oracle数据库默认是手动提交事务
     				* 需要先开启事务,在提交
     		2. 修改事务的默认提交方式:
     			* 查看事务的默认提交方式:SELECT @@autocommit; -- 1代表默认提交,0代表手动提交
     			* 修改默认提交方式:SET @@autocommit = 0;
    
  2. 事务的四大特征:

     1. 原子性:是不可分个的最小操作单位,要么同时成功,要么同时失败
     2. 持久性:当事务提交或回滚后,数据库会持久地保存数据
     3. 隔离性:多个事务之间,相互独立
     4. 一致性:事务操作前后数据总量不变
    
  3. 事务的隔离级别(了解)

     概念:多个事务之间是隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
     
     存在问题:
     	* 脏读:一个事务,读取到另一个事务中没有提交的数据。
     	* 不可重复读(虚读):在同一个事务中,两次读取到的数据不一样。
     	* 幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。	
     
     隔离级别:
     	1. read uncommitted:读未提交
     			产生的问题:脏读、不可重复读、幻读
     	2. read committed:读已提交		(Oracle默认)
     			产生的问题:不可重复读、幻读
     	3. repeatable read:可重复读		(MySQL默认)
     			产生的问题:幻读
     	4. serializable:串行化
     			可以解决所有的问题
     
     注意:隔离级别从小到大安全性越来越高,但是效率越来越低
     
     查询隔离级别:
     	select @@tx_isolation;
     设置隔离级别:
     	set global transaction isolation level 级别字符串;
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值