文章目录

  • 一、数据库概述
  • 1.MySQL的卸载
  • 2.SQL、DB、DBMS分别是什么,他们之间的关系
  • 3.创建数据库和删除
  • 4.什么是表
  • 5.SQL语句的分类
  • 6.导入数据
  • 7.什么是SQL脚本
  • 二、条件查询
  • 1.between..and的用法
  • 2.给字段起别名
  • 3.Is null和Is not null
  • 4.and 和 or 的优先级问题
  • 5.distinct去除重复
  • 6.In 和 not in
  • 7.Like模糊查询
  • 8.数据排序
  • 三、分组查询
  • 1.分组函数
  • 1.Ifnull()空处理函数
  • 2.count(*)和count(具体字段)的区别
  • 3.where后为什么不能用分组函数
  • 2.分组查询
  • 1.group by 和having
  • 2.多字段联合分组查询
  • 3.having 和 where的选择
  • 4.执行顺序
  • 四、连接查询
  • 1.连接查询的概述
  • 2.连接查询的分类
  • 3.关于表别名的作用
  • 4.笛卡尔积现象
  • 5.如何避免笛卡尔积现象
  • 6.内连接之等值连接
  • 7.内连接之非等值连接
  • 8.自连接
  • 9.外连接
  • 10.多张表进行连接
  • 五、子查询
  • 1.where后面嵌套子查询
  • 2.from后面嵌套子查询
  • 3.select后面嵌套子查询
  • 六、union(可以将查询结果拼接)
  • 七、limit(重点,以后分页查询表全靠它)
  • 八、表
  • 1.表的创建
  • 1.char和verchar如何选择
  • 2.删除表
  • 3.复制表
  • 2.插入数据
  • 将查询结果插入到一张表中
  • 3.修改数据
  • 4.删除数据
  • 5.修改表结构
  • 6.约束
  • 1.非空约束
  • 2.唯一性约束
  • 3.主键约束
  • 外键约束
  • 九、存储引擎(了解)
  • 1.MylSAM存储引擎(为了节省空间的时候用)
  • 2.InnoDB存储引擎(默认的存储引擎)(为了安全的时候用)
  • 3.MEMORY存储引擎(为了执行快的时候用)
  • 十、事务
  • 1.什么是事务
  • 2.事务的原理
  • 2.事务的结束标志
  • 3.事务的特性
  • 4.事务的隔离性级别
  • 十一、索引
  • 1.什么是索引,有什么用
  • 2.创建索引对象和删除
  • 3.什么时候考虑给字段添加索引
  • 4.查看SQL的执行计划
  • 5.索引的实现原理
  • 6.索引的分类和什么时候失效
  • 十二、视图
  • 1.什么是视图
  • 2.创建和删除视图
  • 3.索引的作用
  • 十三、DBA常用命令
  • 1.新建用户
  • 2.授权
  • 3.回收权限
  • 4.导出导入
  • 十四、数据库设计三范式(重点,面试经常问)
  • 1.设计三范式的作用
  • 2.第一范式
  • 3.第二范式(多对多设计)
  • 4.第三范式(一对多设计)
  • 5.一对一设计


一、数据库概述

mysql和java谁快_字段


数据库的底层原理都和IO流有关,只不过我们不用写代码了,只需要写SQL就行了

数据库和表在硬盘中是以文件的形式存在的

1.MySQL的卸载

mysql和java谁快_mysql和java谁快_02

2.SQL、DB、DBMS分别是什么,他们之间的关系

mysql和java谁快_字段_03

3.创建数据库和删除

创建数据库

Create database 数据库名

删除数据库

Drop database 数据库名

4.什么是表

mysql和java谁快_mysql和java谁快_04

5.SQL语句的分类

mysql和java谁快_数据库_05

6.导入数据

mysql和java谁快_数据_06


mysql和java谁快_数据_07

7.什么是SQL脚本

mysql和java谁快_数据_08

二、条件查询

mysql和java谁快_字段_09

1.between…and的用法

mysql和java谁快_数据库_10

2.给字段起别名

mysql和java谁快_数据_11

3.Is null和Is not null

mysql和java谁快_数据_12

4.and 和 or 的优先级问题

mysql和java谁快_mysql和java谁快_13

5.distinct去除重复

mysql和java谁快_字段_14

6.In 和 not in

mysql和java谁快_数据_15

7.Like模糊查询

mysql和java谁快_数据_16

8.数据排序

mysql和java谁快_数据库_17


mysql和java谁快_数据_18

三、分组查询

1.分组函数

分组函数只能分完组了之后才能用

mysql和java谁快_数据_19


mysql和java谁快_字段_20

1.Ifnull()空处理函数

mysql和java谁快_字段_21

2.count(*)和count(具体字段)的区别

mysql和java谁快_数据库_22

3.where后为什么不能用分组函数

mysql和java谁快_数据库_23

2.分组查询

分组函数和分组查询一般都一起用,分组查询不用分组函数就没什么意义

1.group by 和having

mysql和java谁快_字段_24


语法规则

mysql和java谁快_数据库_25

2.多字段联合分组查询

mysql和java谁快_mysql和java谁快_26

3.having 和 where的选择

只使用了原数据

mysql和java谁快_数据_27


使用的是计算后的数据

mysql和java谁快_字段_28

4.执行顺序

mysql和java谁快_数据库_29

四、连接查询

1.连接查询的概述

mysql和java谁快_数据_30

2.连接查询的分类

mysql和java谁快_数据库_31

3.关于表别名的作用

不写表别名前面的字段会去后面的每张表中寻找

mysql和java谁快_字段_32

4.笛卡尔积现象

两张表连接查询如果不写条件,那么A表的第一条数据会和B表的每条数据去联合,以此类推A表的第二条。。。,输出的数据是A表的个数*B表的个数

mysql和java谁快_mysql和java谁快_33

5.如何避免笛卡尔积现象

mysql和java谁快_字段_34

通过条件去筛选,如emp表中的TOM,部门号是20,去和dept表中的20匹配,但是20还是依次和dept的每一个部门号查找,找到一样的20就输出显示,查找次数不变,只是显示变了

6.内连接之等值连接

mysql和java谁快_数据库_35


mysql和java谁快_mysql和java谁快_36

7.内连接之非等值连接

mysql和java谁快_字段_37

8.自连接

自连接也能非等值连接

自连接是两表匹配的东西出来,不一定两张表的数据全部出来

mysql和java谁快_mysql和java谁快_38


mysql和java谁快_mysql和java谁快_39

9.外连接

主表的的数据会全部出来,而副表匹配的会出来,不匹配的自动用null来匹配

mysql和java谁快_mysql和java谁快_40


mysql和java谁快_字段_41


mysql和java谁快_数据库_42

案例:找出哪个部门没有员工

mysql和java谁快_字段_43

10.多张表进行连接

mysql和java谁快_mysql和java谁快_44

案例:找出每一个员工的部门名称以及工资等级

mysql和java谁快_数据库_45

案例:找出每一个员工的部门名称、工资等级、以及上级领导

mysql和java谁快_mysql和java谁快_46

五、子查询

mysql和java谁快_数据库_47

1.where后面嵌套子查询

mysql和java谁快_mysql和java谁快_48

2.from后面嵌套子查询

mysql和java谁快_数据库_49


mysql和java谁快_数据_50

3.select后面嵌套子查询

查询D表中和E.deptno相匹配的部门名称

mysql和java谁快_数据_51

六、union(可以将查询结果拼接)

mysql和java谁快_字段_52


mysql和java谁快_mysql和java谁快_53

注意,拼接的两条语句的字段数必须一致,不能一个是两字段,一个是一字段

七、limit(重点,以后分页查询表全靠它)

数据库中可能一张表有很多数据,一次查询出一张表会导致卡顿,浏览器崩溃,这时就要用分页,例如:百度的每一页

mysql和java谁快_mysql和java谁快_54


执行顺序

mysql和java谁快_数据库_55


mysql和java谁快_mysql和java谁快_56


mysql和java谁快_数据库_57

八、表

1.表的创建

表在数据库当中一般建议以t_或tbl_开头

mysql和java谁快_数据库_58


数据类型

mysql和java谁快_数据_59

1.char和verchar如何选择

Char的效率比varchar高

mysql和java谁快_数据库_60

2.删除表

mysql和java谁快_数据库_61

3.复制表

mysql和java谁快_字段_62

2.插入数据

mysql和java谁快_mysql和java谁快_63


mysql和java谁快_mysql和java谁快_64


1.

一次插入多行数据

insert into 表名(字段名1,字段名2…)
values(),(),()

没设置默认追,则自动写null

mysql和java谁快_数据库_65


mysql和java谁快_数据_66

将查询结果插入到一张表中

mysql和java谁快_字段_67

3.修改数据

mysql和java谁快_数据_68

4.删除数据

mysql和java谁快_mysql和java谁快_69

5.修改表结构

mysql和java谁快_数据_70

1.修改表名:
  	ALTER TABLE 表名 RENAME TO 新表名;
 	例:将student表名更改为students
 	 ALTER TABLE student RENAME TO students;

2.表中添加新列
	(1)语法
	alter table 表名 add (列名
	数据类型 [,列名
	数据类型] ...);

	案例:向表中添加一列为evaluatetime  类型为DATE
	alter table emp1 add (evaluatetime  DATE);
	
	(2)注意事项
	新添加的列会按顺序续接原表的列进行排列。
	
3. 修改表中存在的列
	(1)、语法
	alter table 表名 modify (列名 数据类型 [,列名 数据类型] ...);
	
	案例:改变列的数据类型
	alter table emp1 modify (workscore varchar(20));
	
4. 表中删除一个列
	(1)、语法
	 alter table 表名 drop列名;
	 
	(2)、注意事项
	 一次只能删除一列;
	 所删除的列不是表中的唯一列;
	 删除列将无法回滚,所以删除前请确认无误再进行操作。
	 
5.添加约束
	 例:给student表添加主键name;
	  ALTER TABLE student ADD primary key(name);

6.约束

mysql和java谁快_字段_71

1.非空约束

Not null 只有列级约束,没有表级约束

2.唯一性约束

mysql和java谁快_数据_72


mysql和java谁快_数据_73

3.主键约束

mysql和java谁快_字段_74


mysql和java谁快_数据库_75


mysql和java谁快_mysql和java谁快_76


mysql和java谁快_mysql和java谁快_77

外键约束

mysql和java谁快_数据库_78


mysql和java谁快_mysql和java谁快_79


mysql和java谁快_数据库_80


mysql和java谁快_数据库_81


mysql和java谁快_mysql和java谁快_82


mysql和java谁快_数据_83

九、存储引擎(了解)

mysql和java谁快_mysql和java谁快_84


存储引擎就是在建一张表的时候,以什么形式来保存这张表

mysql和java谁快_数据_85

1.MylSAM存储引擎(为了节省空间的时候用)

一张表有三个文件组成

mysql和java谁快_数据库_86

2.InnoDB存储引擎(默认的存储引擎)(为了安全的时候用)

mysql和java谁快_mysql和java谁快_87

3.MEMORY存储引擎(为了执行快的时候用)

mysql和java谁快_数据_88

十、事务

1.什么是事务

mysql和java谁快_字段_89

2.事务的原理

mysql和java谁快_数据库_90


例子:

mysql和java谁快_数据库_91

2.事务的结束标志

== 提交==:成功的结束,将所有的DML语句操作历史记录和底层硬盘数据来一次同步

回滚:失败的结束,将所有的DML语句操作历史记录全部清空

3.事务的特性

mysql和java谁快_数据库_92

4.事务的隔离性级别

多线程的时候

mysql和java谁快_字段_93

脏读:指一个线程中的事务读取到了另外一个线程中未提交的数据。另一个线程中的事务直接回滚的话,我读取到的数据就消失了

不可重复读:做不到这个数据我从头到尾读到的是一样的(比如:A事务早上九点读到14 条记录,我的事务一直没有停止,但是之间B事务改了硬盘的数据,晚上十点时我只能读到13条记录)

可重复读:比如A事务早上九点读到14条记录,我的事务一直没有停止,之间B事务改了硬盘的数据,晚上十点时还是读到14条记录,永远读的是我开启事务时的数据

mysql和java谁快_数据_94

十一、索引

1.什么是索引,有什么用

mysql和java谁快_数据_95

2.创建索引对象和删除

mysql和java谁快_mysql和java谁快_96

3.什么时候考虑给字段添加索引

mysql和java谁快_数据库_97

4.查看SQL的执行计划

mysql和java谁快_mysql和java谁快_98

5.索引的实现原理

mysql和java谁快_数据_99


mysql和java谁快_mysql和java谁快_100

索引会自动排序和分区

索引底层采用的数据结构是:B+Tree

6.索引的分类和什么时候失效

mysql和java谁快_mysql和java谁快_101

十二、视图

1.什么是视图

同一张表的数据,站在不同角度去看

mysql和java谁快_mysql和java谁快_102

2.创建和删除视图

mysql和java谁快_字段_103


mysql和java谁快_mysql和java谁快_104

3.索引的作用

mysql和java谁快_字段_105

十三、DBA常用命令

1.新建用户

格式

CREATE USER username IDENTIFIED BY 'password';

说明:username——你将创建的用户名, password——该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器.

例如:创建一个用户名为 p361密码为123的用户

create user p361 identified by '123';

2.授权

命令格式

grant all privileges on dbname.tbname to 'username'@'login ip' identified by'password' with grant option;

	dbname=  * 表示所有数据库
	tbname=  * 表示所有表
	loginip=  % 表示任何ip
	password为空,表示不需要密码即可登录
	with grant option;  表示该用户还可以授权给其他用户

细粒度授权

@localhost:本地用户
@%:远程用户任何IP

该用户只能在本地IP上登录
首先以root用户进入mysql,然后键入命令:
grant select,insert,update,delete on *.* to p361 @localhost  identified by "123"; 

如果希望该用户能够在任何机器上登陆mysql,则将localhost改为 "%"

粗粒度授权

我们测试用户一般使用该命令授权,
授予p361用户所有权限:
ALL PRIVILEGES,并且该用户能在任何机器上登录mysql
GRANT ALL PRIVILEGES ON *.* TO 'p361'@'%' Identified by "123";        
              
注意:用以上命令授权的用户不能给其它用户授权,如果想让该用户可以授权,用以下命令:
GRANT ALL PRIVILEGES ON *.* TO 'p361'@'%' identified by "123"  WITH GRANT OPTION;

		privileges包括:

                              alter:修改数据库的表

                              create:创建新的数据库或表

                              delete:删除表数据

                              drop:删除数据库/表

                              index:创建/删除索引

                              insert:添加表数据

                              select:查询表数据

                              update:更新表数据

                              all:允许任何操作

                              usage:只允许登录

3.回收权限

命令格式:
revoke privileges on dbname.tbname from username;

例子:回收p361用户的所有权限
revoke all privileges on *.* from p361;

use mysql
select * from user
进入 mysql库中
修改密码;
update user set password =  password('qwe') where user = 'p646';
刷新权限;
flush privileges

4.导出导入

1、导出
例子:导出test数据库,到D盘下,形成test.sql文件
在windows的dos命令窗口中执行:mysqldump test>D:\test.sql -uroot -p123

例子:导出test数据库下的emp表到D盘
在windows的dos命令窗口中执行:mysqldump test emp> D:\ test.sql -uroot –p123


2、导入
Use test ——使用test数据库
登录MYSQL数据库管理系统之后执行:source  D:\ test.sql

十四、数据库设计三范式(重点,面试经常问)

1.设计三范式的作用

设计三范式都是为了减少数据的冗余

提醒:在实际的开发中,以满足客户的需求为主,有的时候会拿冗余换执行速度

2.第一范式

第一范式:任何一张表都应该有主键,并且每一个字段原子性不可再分

问题

mysql和java谁快_mysql和java谁快_106


解决

mysql和java谁快_数据_107

3.第二范式(多对多设计)

第二范式:建立在第一范式的基础之上,所有非主键字段完全依赖主键,不能产生部分依赖

问题,部分依赖

部分依赖只有联合主键的时候才会发生

mysql和java谁快_字段_108


解决

mysql和java谁快_字段_109

4.第三范式(一对多设计)

第三范式:建立在第二范式的基础上,所有非主键字段直接依赖主键,不能产生传递依赖

问题。传递依赖

mysql和java谁快_mysql和java谁快_110


解决

mysql和java谁快_字段_111

5.一对一设计

一个字段主键加外键

mysql和java谁快_字段_112

一对多的变形,在一对多的基础上添加了一个unique

mysql和java谁快_数据_113