MySQL数据库知识点概述

一、为什么要学习数据库

1、为了方便查询数据
2、为了持久化保存数据

二、数据库的相关概念

DBMS、DB、SQL

DB:数据库,保存数据的容器;
DBMS:数据库管理系统或者数据库管理产品;常见的数据库管理系统:MySQL 、ORACAL 、DB2、sql server
SQL:结构化查询语句

三、数据库存储数据的特点

1、表是放在库里面的;
2、数据是存放在表里面的;
3、一个数据库里面表名是唯一的
4、数据库里面列名称之为字段
5、表中数据是以行的形式存放

四、初始化MySQL

MySQL服务登录和退出

登录:
	MySQL -u root -p
退出:
	quit;或者 exit;

MySQL的常见命令和语法规范

语法规范:
		1、关键字大写,表名、字段名小写;
		2、MySQL支持关键字小写;
常见命令
		查询有哪些数据库:
						show databases;
		指定操作数据库:
						use 数据库名字;
		查看数据库中有哪些表:
						show tables;
		查看表结构
					    desc表名;
		查看表数据:
						select * from 表名
MySQL5.6中文支持问题
		DEFAULT CHARSET=GB2312;

五、DDL语言(数据定义语言)

库和表的管理

创建数据库:
		create database 库名;
删除数据库:
		drop database 库名;
		
创建表:
		注意:要创建表,需要先要use 数据库
		创建表:
				create table 表名(
				字段名 数据库类型,
				字段名 数据库类型,
				字段名 数据库类型
				);
				
	 	删除表:
	 		 drop table 表名;

MySQL修改表

1、修改表名 rename
		alter table 旧表名 rename 新表名;

2、 修改字段的数据类型 modify
		alter table 表名 modify 字段名 字段类型;

3、修改字段名 change
		alter table 表名 change 旧字段名 新字段名 旧(新)字段类型;

4、添加字段 add

	将 添加字段 添加到第一列
		alter table 表名 add 添加字段 数据类型 first;
		
	将 添加字段 添加到 某一字段 之后
		alter table 表名 add 添加字段 数据类型 after 某一字段;
		 

5、删除字段 drop 
		alter table 表名 drop 字段名;

三大范式

设计表的时候的规范
https://www.cnblogs.com/auguse/articles/11935686.html

常见数据类型的介绍

常见约束

1、主键 primary key 
	作用:DBMS为了方便查找数据库,而设计的一个规则
	特点:
		一张表里面主键是唯一的
		主键可以用来唯一的标识一行数据,主键不能为空
	
	联合主键:表中字段不能作为唯一标识每一行数据时,选取表中两个或者多个字段作为联合主键
	联合主键的特点:如果去掉联合主键某个字段,剩下的字段任然可以构成联合主键,那么说明之前的联合主键是错误的
	
	创建联合主键:
		create table 表名(
   		-> name char(16),
   		-> gender char(10),
   		-> birthday date,
   		-> city varchar(16),
   		-> primary key(name,city)
   		-> );	

	创建表的时候设置主键:
		方式一:
			create table 表名(
   			-> id int(11) primary key,
   			-> name varchar(12)
   			-> );
	
		方式二:
			create table 表名(
  			-> id int(11),
  			-> name varchar(12),
  			-> primary key(id)
     	    -> );
	
	在修改表时添加主键
		alter table 表名 add primary key(id);

	删除主键:
		alter table 表名 drop primary key;

2、主键自增 auto_increment
	通过auto_increment设置主键自增
	特点:
		和主键配合使用
		自增字段的数据类型是整数类型
		自增的数据开始值是1,每自增一行数据,自增1
	
	添加自增
		create table 表名(
		-> id int(11) primary key auto_increment,
		-> name varchar(25),
		-> location varchar(50)
		-> );
	
	设置自增默认值
		create table 表名(
		-> id int(11) primary key auto_increment,
		-> name varchar(25),
		-> location varchar(50)
		-> )auto_increment=100;
		
	修改表时设置自增
		alter table 表名 change column 字段名 字段名 数据类型 auto_increment;
		
	修改表时设置自增默认值
		alter table 表名 auto_increment=100;
		
	删除自增
		alter table 表名 modify 字段名 数据类型;
		
3、外键 foreign key (从表字段名) references 主表(字段名)
	表间关系
		一对一
		一对多
		多对多
		
	特点
		外间关联是主表要先于从表创建
		外键字段的值必然在主表中是可以一一对应的
		外键可以为空,但是不为空的外键必然可以在主表中跟它对应
		外键关联的必然是主表的主键

	创建外键约束
		create table 表名(
   		-> id int(10) not null primary key auto_increment,
	 	-> sid int(10),
		-> name varchar(50),
		-> subject varchar(50),
		-> score varchar(50),
		-> constraint 外键名 
		-> foreign key(字段名) references 主表(字段名)
		-> );
		
	修改表时设置外键约束
		alter table 从表名 add constraint 外键名  foreign key(从表字段名) references 主表名(字段名)

	删除外键约束
		alter table 从表名 drop foreign key 外键名

4、唯一约束 unique
	特点:
		主键在一个表里面只能有一个,但是唯一性约束可以有多个
		设置了唯一性约束的字段表中有且只能有一个空值
	
	创建表时设置唯一约束
		create table 表名(
		-> id int(11) primary key,
		-> name varchar(25) unique,
		-> location varchar(50)
		-> );
	
	修改表时添加唯一性约束
		alter table 表名 add unique(字段名);
	
	设置别名:
		alter table 表名 add constraint 别名 unique(字段名);
		
	删除唯一约束
		alter table 表名 drop index 字段名/别名;	
		
5、默认值 default
	特点:在插入数据时,如果不写入数据就使用默认值,如果写入数据就使用数据

	创建表时设置默认值
		create table 表名(
		-> id int(11) PRIMARY KEY,
		-> name varchar(25),
		-> location varchar (50) default '默认值'
		-> );

	修改表时设置默认值
		alter table 表名 change 字段名 字段名 数据类型 default '默认值';
		
6、非空约束 not null
	特点:一张表中可以设置多个字段非空,主键默认非空
	
	创建表时设置非空约束
		create table 表名(
		-> id int(11) not null,
		-> name varchar(35),
		-> location varchar(50)
		-> );

	修改表时设置非空约束
		alter table 表名 change 字段名 字段名 数据类型 not null;
		
7、查看sql
	show create table 表名;

六、DML语言(数据操纵语言)

插入语句

不指定字段插入:
	insert into 表名 values (1,'lsii',56,'13512345678');
指定字段名插入:
	insert into 表名 (name,age,stuphone) values ('lsii',56,'13512345678');
同时插入多行数据:
	insert into 表名 values 
	-> (2,'wangwu',46,'13612345678'),
	-> (3,'sadfsa',34,'13412345678');

修改语句

修改其中某个字段的值
	update 表名 set id = 4 where age=56;
多个字段同时修改值的时候用逗号隔开
 	update 表名 set id = 4,name='augus' where age=56;

删除语句

删除其中某一行数据
	delete from 表名 where name='fengliu';
同时删除多行数据:
	delete from 表名 where name in ('lisi','wangwu');

七、DQL数据查询语言

条件查询

查询会产生一张虚拟表

1、语法结构:
		select 字段名,字段名 from 表名 where 筛选过滤条件;
	注意:*号代表表中所有字段,这个不建议使用,会影响查询效率

2、查询表中所有数据库
		select * from 表名;
	
		指定字段查询
			seletct 字段名,字段名 from 表名;

3、设置别名 as
	select 字段名 as 别名,字段名 as 别名 from 表名;

	select 字段名 别名,字段名 别名 from 表名;

4、limit使用
	select * from 表名 limit 0,2;
	注意:limit 0,2 逗号前面表示从哪一行开始取值,第一行是0,逗号右边值取到多少行
	

5、排除重复 distinct
	select distinct 字段名 from 表名;
	
	使用distinct多列排除重复,并不意味任一列没有重复只有在组合时没有重复
		select distinct 字段名,字段名 from 表名;

6、单条件查询:
	单条件查询符号:=		!=		<		>		>=		<=
	select * from 表名 where 字段名 单条件查询符号 条件;

7、多条件查询:
	and		or		not
	select * from student where id>=905 and sex='女';
	select * from student where id>=905 or sex='男';
	select * from student where not id>=905;

8、范围选择:
	方式一:
		select * from student where (2010-birth)>20 and (2010-birth)<28;
	
	方式二:between and
		select * from student where 2010-birth between 20 and 28;
		select * from student where (2010-birth)>=20 and (2010-birth)<=28;
	
	方式三:not between and
		select * from student where 2010-birth not between 20 and 28;

9、集合操作:
	1、or
	   select * from student where department='计算机系' or department='英语系' or sex='女';
	
	2、in
	   select * from student where department in ('计算机系','中文系');
	
	3、not in
	   select * from student where department not in ('计算机系','中文系');

10、模糊匹配 like
	_ 一个字符
		select * from student where name like '_三';

	% 任意字符 可以是0个
		select * from student where address like '辽宁%';

11、查询空号 is null
	select * from student where name is null;

12、设置常量列
	select name as 姓名,address as 地址,'希望小学' as 学校 from student;

排序查询

升序 asc
		select * from score where c_name='计算机' order by grade asc;
	降序 desc
		select * from score where c_name='计算机' order by grade desc;

分组函数

1、聚合函数
	count 计数:
		select count(grade) from score
	max 求计算机系学生的最高分
		select stu_id as 学号, max(grade) as 成绩 from score where c_name='计算机'
	min 求计算机系学生的最低分
		select stu_id as 学号, min(grade) as 成绩 from score where c_name='计算机'
	sum 求和
		select stu_id as 学号, sum(grade) as 成绩 from score where c_name='计算机'
	avg 平均值
		select stu_id as 学号, avg(grade) as 成绩 from score where c_name='计算机'

分组查询

关系型数据库管理系统在执行一条SQL时,按照如下顺序执行各子句:
	首先执行from子句,从表中查找数据;
	如果有where子句,则根据其中的过滤条件,从表中去掉不满足过滤条件的行。
	根据group by子句中指定的分组列,对中间表中的数据进行分组。
	为每个组计算select子句聚合函数的值,并为每组生成查询结果中的一行。
	如果有having子句,则根据having子句的过滤条件,分组计算聚合计算的结果再次过滤。
	如果有order by子句中,则根据order by子句中的列,对结果集进行排序。
	
分组	
	where子句:从数据源中去掉不符合其搜索条件的数据
	group by子句:搜集数据行到各个组中,统计函数为各个组计算统计值,每个组输出一行结果
	having子句:从分组计算结果中进行过滤,去掉不符合其组搜索条件的各组数据行

	求每个系的平均分
		select c_name,avg(grade) from score group by c_name
	多字段分组
		select stu_id,c_name,avg(grade) from score group by c_name,stu_id
	having 对之前分组的结构进行过滤
		select c_name,avg(grade) from score group by c_name having avg(grade)<=90;

连接查询

内连接:求两张表交集的部分
	select * from a_table inner join b_table on a_table.a_id = b_table.b_id
	
左连接: 以左表为基础,展示出左表全部数据和右表交集部分数据
	select * from a_table left join b_table on a_table.a_id = b_table.b_id
	
右连接:以右表为基础,展示出右全部数据和左表交集部分数据
	select * from a_table right join b_table on a_table.a_id = b_table.b_id

子查询

sql里面嵌套sql
	select id,name from student 
	where id=(
	select stu_id from score where c_name='计算机' and grade=70);

in 后面可以赋多个值,用括号
	中文系的学生信息
	select * from student where id in (select stu_id from score where c_name='中文') 

not in
	select * from student where id not in (select stu_id from score where c_name='中文') 
	
exists 如果子查询返回结果为真 则执行前面sql ,如果为假 则前半句sql执行结果为空
	select * from score where exists (select stu_id from score where c_name='中文111')
	
all 本质用and 	是所有		取最大值
	all表示全部都满足才返回true,并执行前面的语句
	
	z.B
	select * from student where class='01' 
	and age > all(select age from student where class='02');
	
	查询01班中年龄大于02班所有人的同学
	
	select * from student where class='01' 
	and age >(select max(age) from student where class='02');
	
any 本质用or 	是任意一个		取最小值
		any表示有任何一个满足就返回true,并执行前面的语句
		z.B
		select * from student where class='01' 
		and age > any(select age from student where class='02');
		
		查询01班中年龄大于02班任意一个人的同学
		
		select * from student where class='01' 
		and age >(select min(age) from student where class='02');

分页查询

union联合查询

union 合并表
	all 数据会重复
		select * from student_copy union all select * from student;
	
	不加all会去重
		select * from student_copy union select * from student;

八、TCL语言

事务和事务处理

事务具有 4 个特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),这 4 个特性通常简称为 ACID。

1. 原子性
事务是一个完整的操作。事务的各元素是不可分的(原子的)。事务中的所有元素必须作为一个整体提交或回滚。如果事务中的任何元素失败,则整个事务将失败。

以银行转账事务为例,如果该事务提交了,则这两个账户的数据将会更新。如果由于某种原因,事务在成功更新这两个账户之前终止了,则不会更新这两个账户的余额,并且会撤销对任何账户余额的修改,事务不能部分提交。

2. 一致性
当事务完成时,数据必须处于一致状态。也就是说,在事务开始之前,数据库中存储的数据处于一致状态。在正在进行的事务中. 数据可能处于不一致的状态,如数据可能有部分被修改。然而,当事务成功完成时,数据必须再次回到已知的一致状态。通过事务对数据所做的修改不能损坏数据,或者说事务不能使数据存储处于不稳定的状态。

以银行转账事务事务为例。在事务开始之前,所有账户余额的总额处于一致状态。在事务进行的过程中,一个账户余额减少了,而另一个账户余额尚未修改。因此,所有账户余额的总额处于不一致状态。事务完成以后,账户余额的总额再次恢复到一致状态。

3. 隔离性
对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。修改数据的事务可以在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据。

另外,当事务修改数据时,如果任何其他进程正在同时使用相同的数据,则直到该事务成功提交之后,对数据的修改才能生效。张三和李四之间的转账与王五和赵二之间的转账,永远是相互独立的。

4. 持久性
事务的持久性指不管系统是否发生了故障,事务处理的结果都是永久的。

一个事务成功完成之后,它对数据库所作的改变是永久性的,即使系统出现故障也是如此。也就是说,一旦事务被提交,事务对数据所做的任何变动都会被永久地保留在数据库中。

九、视图

1、什么是视图?
	视图是保存查询的结果,把查询的结果当做一张虚拟的表,视图依赖于原始的表数据和结构,如果原来的表数据或者结构发生了改变,视图的结构和数据也会发生相应改变,

2、视图的特点:
	1、效率高
	2、安全性,可以指定展示其中某几列数据,隐藏敏感信息
	
3、语法结构
	create view 视图名 as 查询sql
	
	创建视图
		create view showtime as select * from student;
		
4、创建视图时指定字段名
	create view showtime (sid,sname,sex,birth,classid) as select * from student;

5、创建多表视图  不能使用*
	create view showtime as select
	student.sno,student.sname,student.ssex,student.sbirthday,
	student.class,score.cno,score.degree 
	from student,score where student.sno = score.sno;
	
6、查看视图结构
	desc showtime
	
7、查看创建视图的sql
	show create view showtime
	
8、修改视图
	语法结构:	
 		ALTER VIEW 视图名 AS 新的查询sql
	
	修改视图
	alter view showtime as selsct
	student.sno,student.sname,student.ssex,student.sbirthday,
	student.class,score.cno,score.degree 
	from student,score where student.sno = score.sno;
	
9、修改视图的数据
	update showtime set sname='新的字段名' where sid=103
	
10、删除视图
	drop view showtime;

十、变量

十一、存储过程和函数

1、什么是存储过程?
	多句sql同时执行,先编译好存储在服务端,

2、特点
	执行效率高
	重复使用


3、临时改变结束符号
	delimiter //

4、创建存储过程
	delimiter //
	create procedure showtime()
	begin
		select * from student;
	end//

5、调用存储过程
	call showtime()
			call showtime('吊炸天')

6、查看存储过程创建sql
	show create procedure showtime

7、创建带参数的存储过程
	delimiter //
	create procedure showtime (in name varchar(30))
	begin
		select * from student where sname=name;
	end//

8、删除存储过程
	drop procedure showtime

十二、数据库备份

1、备份数据库中某个表
	mysqldump -uroot -p test student>C:\student.sql

2、备份指定库
	mysqldump -uroot -p test woniutest>C:\student.sql

3、导出数据库信息
	SELECT * FROM student INTO OUTFILE 'C://Pcode/person.txt';
	
	如果导出失败:
    	则需要添加secure_file_priv
	
	查看secure-file-priv当前的值
		show variables like '%secure%'; 
	
4、恢复数据库
	mysql -u root -p < C:\all.sql
	
 5、备份所有数据库
 	mysqldump -u root -p --all-databases > C:\all.sql