Mysql数据库(总结)

一.SQL语言

1.SQL语言基础概述

SQL(Structured Query Language):结构化查询语言,用于访问和处理数据库的标准的计算机语言

2.SQL特点

  • 具有综合统一性,不同数据库的支持的SQL稍有不同

  • 非过程化语言

  • 语言简洁,用户容易接受

  • 以一种语法结构提供两种使用方式

3.SQL语法特点

  1. SQL对关键字的大小写不敏感

  2. SQL语句可以以单行或者多行书写,以分号结束

  3. SQL的注释:

    1.单行注释:-- ,--后面一定要加一个空格 ​ 2.单行注释:#,#后面可加可不加空格 ​ 3.多行注释:/* */

二.数据库系统(一)

1.数据Data(和你的日期单词Date不要混)

数据:是描述事物的符号记录

是指用物理符号记录下来的、可以鉴别的信息

2.数据库

数据库(DataBase)是一个以某种组织方式存储在磁盘上的数据的集合

3.数据库应用

数据库应用系统是指基于数据库的应用软件

4.数据库管理系统(数据库软件)

(1)关系型数据库(RDBMS)

  • Oracle数据库--------------------老大,最挣钱的数据库
  • MySQL数据库-------------------最流行中型数据库
  • SQL server数据库--------------Windows上最好的数据库
  • PostgreSQL----------------------功能最强大的开源数据库
  • SQLite-----------------------------最流行的嵌入式数据库

(2)非关系型数据库(NoSQL)

  • Redis-----------------------------最好的缓存数据库
  • MongoDB-----------------------最好的文档型数据库
  • Elasticsearch------------------最好的搜索服务
  • Cassandra---------------------最好的列式数据库
  • HBase--------------------------优秀的分布式、列式数据库

三.数据库系统(二)

5. SQL和数据库管理系统的关系

  • SQL是一种用于操作数据库的语言,SQL适用于所有关系型数据库
  • MySQL、Oracle、SQLServer是一个数据库软件,这些数据库软件支持标准SQL,也就是通过SQL可以使用这些软件,不过每一个数据库系统会在标准SQL的基础上扩展自己的SQL语法
  • 大部分的NoSQL数据库有自己的操作语言,对SQL支持的并不好

6.关系型数据数据库管理系统组成

数据库管理系统(DBMS)主要由数据库和表组成,一个系统可以用很多数据库,每个数据库可以有很多表。

7.数据库的四大完整性

1.实体完整性:要求行的 必须是完整的一条数据 指数据库中所有实体(比如你的表、视图、存储过程 等)他们的属性必须

符合其定义,而且每个实体都是必须存在的。

约束方法:唯一约束 主键约束 自动增长列(标识列)

2.域完整性:约束列的,指数据库中的每个列的值必须符合其数据类型和约束

比如: 一个列数据类型是整数,则该列的值必须是整数

约束方法:外键约束 默认约束 非空约束

3.参照完整性(引用完整性) 指的是 在数据库中表之间的参照关系必须保持一致

例如: 如果一个表中的某一列引用了另一个表中的主键 则该列的值必须在另一个表中存在

约束方法: 外键约束

4.用户定义完整性(自定义完整性)

指用户可以根据自己的需求定义数据库的完整性规则

比如:定义某个列的值必须大于另一个列的值,或者某个列的值必须在特定范围内,比如编号只能输入1-10000

约束规则: 触发器、存储过程等。。。。

四.MySQL简介

1.MySQL介绍

  • MySQL数据库管理系统由瑞典的DataKonsultAB公司研发,该公司被Sun公司收购,现在Sun公司又被Oracle公司收购,因此MySQL目前属于Oracle旗下产品
  • MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言。MySQL软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,一般中小型网站的开发都选择MySQL作为网站数据库。

2.MySQL的特点

  1. MySQL数据库是用C和C++语言编写的,以保证源码的可移植性;
  2. 支持多个操作系统,例如:Windows、Linux、Mac OS等;
  3. 支持多线程,可以充分的利用CPU资源;
  4. 为多种编程语言提供API,包括C语言,Java,PHP,Python语言等;
  5. MySQL优化了SQL算法,有效的提高了查询速度;
  6. MySQL开放源代码且无版权制约,自主性强、使用成本低;
  7. MySQL历史悠久、社区及用户非常活跃,遇到问题,可以很快获取到帮助

3.MySQL版本

  • MySQL Community Server------社区版,免费,但是MySQL不提供官方技术支持
  • MySQL Enterprise Edition-----商业版,收费,可以试用30天,官方提供技术支持
  • MySQL Cluster-----集群版,开源免费,可将几个MySQL Server封装成一个Server
  • MySQL Cluster CGE----高级集群版,付费
  • MySQL Workbench(GUI TOOL)---专为MySQL设计的ER/数据库建模工具

五.Mysql数据库

进入数据库的命令:

#方式一: 直接输入用户名 密码 例如:-uroot -proot(直接输入密码可能会泄露密码)
mysql -u用户名-p密码
#方式二: 先输入用户名不输入密码 回车以后在输入密码 (输入密码 不会让其他人看到(以※的方式显示))
mysql -u用户名-p	
#方式三: 连接其他人的数据库  mysql-h要连接其他人数据库的ip地址
mysql-h主机地址 -u用户名-p密码

在DOS窗口中 输入数据库常用命令

展示所有数据库: show databases;
切换到某个数据库: use 数据库名;
查看数据库下的所有表: show tables;
退出数据库: exit;
创建数据库: create database 数据库名;
删除数据库: drop database 数据库名;
#注意: dos窗口中输入的命令每句都要加分号!!!!!!!!!!

六.MySQL常用图形管理工具

1.为什么要用图形化管理工具

若日常开发和维护都在类似dos窗口中进行,对于编程初学者来说,上手略微有点困难,增加了学习成本,一般使用mysql图形化管理工具连接mysql,然后在图形化界面上操作mysql

2.常用工具

(1)Navicat

是一套快速、可靠的数据库管理工具,Navicat是以直觉化的图形用户界面而建的,可以兼容多种数据库,支持多种操作系统

(2)SQLyog

是一个快速而简洁的图形化管理MySQL数据库的工具,他能够在任何地点有效地管理数据库。使用SQLyog可以快速直观地通过网络来维护远端的MySQL数据库

(3)MySQL Workbench

官方提供的图形化管理工具,分为社区版和商业版,社区版完全免费,而商业版则是按年收费。支持数据库的创建、设计、迁移、备份、导出和导入等功能,并且支持Windows、Linux和mac等主流操作系统。

(4)DataGrip

是一款数据库管理客户端工具,方便连接到数据库服务器,执行sql、创建表、创建索引以及导出数据等

(5)其他工具
  • phpMyAdmin
  • MySQLDumper
  • MySQL GUI Tools
  • MySQL ODBC Connector

七.SQL语句

1.SQL通用语法

  1. SQL语句可以单行或多行书写,以分号结尾;
  2. SQL语句可以使用空格/缩进 来增强语句的可读性;
  3. MySQL数据库的SQL语句不区分大小写,关键字建议使用大写;
  4. 注释:        1.单行注释: --注释内容 或 # 注释内容

                                2.多行注释: /* 注释内容 */

2.SQL语句的分类

结构化查询语言 T-sql

(1) DDL(Data Definition Language):数据定义语言

用来定义数据库对象(数据库,表,字段)

  • 数据库操作
-- 查询
# 查询所有数据库
SHOW DATABASES;

# 查询当前数据库
SELECT DATABASE();
 
-- 创建数据库
CREATE DATABASE 数据库名;
 
-- 删除数据库
DROP DATABASE 数据库名;
 
-- 使用哪个数据库
USE 数据库名;
  • 表操作

1.查询

# 查询当前数据库所有表
SHOW TABLES;
# 查询表结构
DESC 表名;
# 查询指定表的建表语句
SHOW CREATE TABLE 表名;
 
# 创建表
CREATE TABLE 表名(
	字段1  字段1类型[COMMENT 字段1注释],
	字段2  字段2类型[COMMENT 字段2注释],
	字段3  字段3类型[COMMENT 字段3注释],
	……
	字段n  字段n类型[COMMENT 字段n注释]
)[COMMENT 表注释];

2.修改

# 添加字段
ALTER TABLE 表名 ADD 字段名 类型(长度)[COMMENT 注释] [约束];
 
# 修改数据类型
ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
 
# 修改字段名和字段类型
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];
 
# 删除字段
ALTER TABLE 表名 DROP 字段名;
 
# 修改表名
ALTER TABLE 表名 RENAME TO 新表名;

#修改表名:
ALTER TABLE 旧表名 RENAME AS 新表名   (alter table 旧表名 rename as 新表名)

#修改字段
ALTER TABLE 表名MODIFY 字段名 列类型[属性]  (alter table 表名 modify 字段名 列类型[属性])

ALTER TABLE 表名 CHANGE 旧字段名 新字段名 列类型[属性]   (alter table 表名 change 旧表名 新字段名 列类型[属性])

3.删除

# 删除表
DROP TABLE [IF EXISTS] 表名;
# 删除指定表,并重新创建该表
TRUNCATE TABLE 表名;
-- 注:在删除表时,表中的全部数据也会被删除

#删除字段
ALTER TABLE 表名 DROP 字段名   (alter table 表名 drop 字段名)
	补充: 查看表结构 desc 表名;
		describe 表名;

添加字段

ALTER TABLE表名 ADD 字段名 列类型[属性] (alter table 表名 add 字段名 列类型[属性])

(2)DML语句(Data Manipulation Language) 数据操作语言

用来对数据库表中的数据进行增删改

①添加数据(INSERT)

增加 insert into 表名(列名...) values(值...)

②修改数据(UPDATE)

#修改 
update 表名 set 列名= 更新值 where 条件

③删除数据(DELETE)

#删除 
delete from 表名 where 条件
truncate  table 表名

Mysql 删除语法

面试题: delete 和truncate的区别:
  1. 都可以直接删除表中的数据
  2. delete可以加where条件,truncate不可以添加条件
  3. delete删除之后,会保auto increment的自增序列,而truncate会清空 从新开始标注
  4. delete不会影响事务,而truncate 会影响事务

示例:

'delete from grade where gradeName = '大六';
-- 如果不指定条件 也是删除所有数据 但是会保留自增序列
delete from grade;

-- Truncate清空 清空表的内容  会删除自增序列
TRUNCATE TABLE grade;
示例: (关键字)
insert (增加)
update (修改)
delete (删除)

④查询数据(SELECT)(基础查询)

查询 select * from 表名  (*号代表 表中的所有数据)

DML语句代码:

-- 添加外键 让Student和Grade表建立关系
-- 因为我们是关系型数据库,一般我们需要建立表关系
-- 建立表关系后,可以保证数据的合理性、完整性
ALTER TABLE Student
	ADD CONSTRAINT fk_student_grade
		FOREIGN key (gradeId)
			REFERENCES Grade(gradeId)

-- 删除外键
ALTER TABLE student DROP FOREIGN key fk_student_grade


SELECT * from Student
-- 增加语法
/*
	1.在增加时,必须保证没有插入数据的字段 可以为空
	2.列的值可以不按照正常顺序来写,但是一般还是按照顺序 方便记忆
	3.除了字符串和日期类型 其他的都可以不加''
	4.如果有自动增长列 可以不插入值, 如果你写了列名 值可以写null代表不管他
*/
insert INTO Student(Loginpwd,Studentno,StudentName,Address,borndate,Email)
VALUES('123311',null,'小黑','中南海','2012-1-1','250@qq.com')

INSERT INTO Student
VALUES(null,'123321','小白','女',1,'12312341234','北京','2021-1-1','123@qq.com','123456')

-- 一次性插入多列
INSERT INTO Grade(GradeName)
	VALUES('S5'),('S6'),('S7');

SELECT * FROM Grade;

-- 配合并集查询(增加)
INSERT INTO Grade(GradeName)
	SELECT 'S5' UNION
	SELECT 's6' UNION
	SELECT 's7'

-- 从一张表查询出来数据 插入到不存在的表中
CREATE TABLE newGrade
	SELECT GradeId,GradeName from Grade
			
-- 从一张表查询出来数据 插入到已经存在的表	
INSERT INTO newGrade(gradeId,GradeName)
SELECT GradeId,GradeName from Grade

(3)DQL语句(Data Query Language) 数据查询语言

        用来查询数据库中表的记录

示例: select

1.掌握mysql查询语句

SELECT   [ALL | DISTINCT] 
{  * |  table.* | [ table.field1 [ as  alias1] [, table.field2 [as  alias2]][, …]] }
FROM  table_name  [ as  table_ alias  ]
    [ left|out|inner  join  table_name2 ]    #联合查询
	[ WHERE  … ]   	#指定结果需满足的条件
	[ GROUP BY …]	#指定结果按照哪几个字段来分组
	[ HAVING …]	#过滤分组的记录必须满足的次要条件
	[ ORDER BY… ]	#指定查询记录按一个或者多个条件排序
	[ LIMIT  {   [ offset,] row_count    |   row_count OFFSET offset   }] ;  #指定查询的记录从哪条至哪条

[]代表可选
{}代表必须选择
|  或者
* 所有行和列
table表名 
field1 属性(字段名)

2.基本查询

-- 删除年级信息
DELETE FROM Student WHERE GradeId=1;
DELETE FROM Grade WHERE GradeId=1;

-- 删除时 必须先删从表再删主表


SELECT * FROM Student
-- 添加从表时 需要看看主表中有没有数据信息
SELECT * from Result
INSERT INTO Result
VALUES(null,4,2,90,'2012-1-1')




--  查询所有行和列 使用*表示 但是效率(在学习过程为了方便 可以使用)
SELECT * FROM Student

-- 查询部分行和列
-- 如果涉及到性能问题,不要使用*来表示所有列的值 把所有要查询的字段 一个一个写出来
SELECT studentNo,StudentName,Address
FROM Student

SELECT Student.studentNo,Student.StudentName,Student.Address
FROM Student

-- 给表起别名
SELECT stu.studentNo,stu.StudentName,stu.Address
FROM Student stu

-- 给列起别名
SELECT StudentNo '学号',StudentName '学生姓名'
from Student 

SELECT StudentNo as '学号',StudentName as '学生姓名'
from Student 

-- 查询所有学生的地址
SELECT ALL Address from Student
-- 去除重复的数据
SELECT DISTINCT Address from Student

-- 表达式一般由文本值、列值、NULL、函数和操作符等组成

-- 需求: 将80分的学生成绩查询出来 并且+10分
SELECT * from result;

SELECT
	StudentNo,StudentResult+10
FROM
	Result 
WHERE
	StudentResult>=80


-- 增加
INSERT into Result
VALUES(NULL,4,1,60,'2021-1-1')


select 10+10 AS 结果


/*
查询课程表(subject)的所有记录,返回数据
要求
返回字段名称使用别称
返回课程名称 (SujectName) 
总课时(SubjectHour)
返回10天上完课程的均课时
(ClassHour/10)

*/

SELECT
	SubjectName AS '科目名称',
	ClassHour AS '总课时',
	ClassHour / 10 AS '均课时' 
FROM
	`Subject`
	
-- 查询可以增加条件	
-- null未赋值、没有值    单元格是空的 代表空字符串
SELECT * from student

-- 查询没有身份证信息的
SELECT StudentName 姓名,IdCard 身份证
from Student
WHERE IdCard is not null

-- 查询空白字符串
SELECT StudentName 姓名,phone 电话
from Student
WHERE phone=''


-- 查询 成绩在80-90之间的 学生学号信息
SELECT StudentNo,StudentResult
from Result
WHERE StudentResult>=80 and StudentResult<=90

-- 等价于上方
SELECT StudentNo,StudentResult
from Result
WHERE StudentResult BETWEEN 80 and 90


SELECT * from Student

-- 模糊查询
SELECT * from Student WHERE StudentName='李四'
-- 我要显示全部姓李的同学
-- 通配符  %  _  
SELECT * from Student WHERE StudentName like '李%'

SELECT * from Student WHERE StudentName like '李__'

-- 查询1年级的学生或者2年级的学生
SELECT * from Student WHERE GradeId=3 or GradeId=2
SELECT * from Student WHERE	GradeId in(3,2)

3.连接查询

-- 查询学生的姓名、年级、地址、
-- 注意 表起了别名后 需要使用别名
SELECT s.StudentName 姓名,g.GradeName 年级,s.Address 地址
FROM Student s
INNER JOIN Grade g
on s.GradeId=g.GradeId

-- 注意表连接 必须要加条件 如果不加产生两张表记录相乘的效果(笛卡尔积)
SELECT s.StudentName 姓名,g.GradeName 年级,s.Address 地址
FROM Student s,Grade g
WHERE s.GradeId=g.GradeId

-- 三张表连接
-- 查询学生的姓名、年级、成绩
SELECT s.StudentName 姓名,g.GradeName 年级, r.StudentResult 成绩
from Student s
inner join Grade g 
on s.GradeId=g.GradeId
INNER JOIN Result r
on r.StudentNo=s.StudentNo

-- 外连接
-- 左外连接:以左边的为主表 右表依次匹配
SELECT s.StudentName,g.GradeName
from Student s 
left join Grade g
on s.GradeId = g.GradeId



-- 右外连接:以右边的为主表 左边表依次匹配
SELECT s.StudentName,g.GradeName
from Student s 
right join Grade g
on s.GradeId = g.GradeId

CREATE TABLE IF NOT EXISTS category(
     categoryId int(10)  auto_increment  primary key,
     categoryName   varchar(32) not null ,
     pid  int(10)
);


-- 掌握自连接
SELECT c.categoryId 编号,c.categoryName 类别,c1.categoryName 游戏名称
from category c,category c1
WHERE c.categoryId = c1.pid

4.排序算法

-- 排序查询  
-- 查看成绩表中所有成绩 并且升序序排序
SELECT * from Result
ORDER BY StudentResult asc

-- 降序
SELECT * from Result
ORDER BY StudentResult desc

-- 学号按照升序 成绩按照降序
-- 按照第一个排序的规则来变  后面的规则要依照前面的规则
SELECT StudentNo,StudentResult
FROM Result
ORDER BY StudentNo ASC,StudentResult DESC

-- 都按照升序排序
SELECT StudentNo,StudentResult
FROM Result
ORDER BY StudentNo,StudentResult asc

5.分页查询

-- 分页查询 LIMIT(开始索引,每页显示的条数)  
-- 开始索引是从0开始
SELECT * FROM student
-- 分页查询每行显示三条 第一页
-- 开始索引: 当前页-1 * 每页显示的条数
SELECT * FROM Student
LIMIT 0,3

-- 第二页
SELECT * FROM Student
LIMIT 3,3

-- 第三页
SELECT * FROM Student
LIMIT 6,3

-- 只有一个参数的时候 显示多少条
-- 显示成绩中成绩最高的学生 编号和成绩
SELECT StudentNo,StudentResult 
FROM Result
ORDER BY StudentResult DESC
LIMIT 1

-- 
/**
查询所有《数据库结构-2》的考试成绩,并按照由高到低显示,
同时把该成绩对应的学生的学号、姓名打印出来
	java
*/
SELECT 
r.studentno 学号,s.StudentName 姓名,sb.SubjectName 科目名称,StudentResult 成绩
FROM student s
INNER JOIN Result r
on s.StudentNo = r.StudentNo
INNER JOIN `Subject` sb
on sb.SubjectId = r.SubjectId
WHERE sb.SubjectName='java'
ORDER BY StudentResult desc
LIMIT 0,5

SELECT r.studentno 学号,s.StudentName 姓名,sb.SubjectName 科目名称,StudentResult 成绩
FROM student s
INNER JOIN Result r
on s.StudentNo = r.StudentNo
INNER JOIN `Subject` sb
on sb.SubjectId = r.SubjectId
WHERE sb.SubjectName='java'
ORDER BY StudentResult desc
LIMIT 5,5

6.子查询

-- 子查询
-- 需求 查询课程编号为1的 并且成绩大于70的学生学号
SELECT StudentNo
FROM Result
WHERE `SubjectId`=1 and StudentResult>=70

select * from Result
-- 需求 查询课程名字是java的 并且成绩大于70的学生学号  
SELECT r.StudentNo
from Result r
WHERE r.SubjectId=(select sb.SubjectId from `Subject` sb WHERE sb.SubjectName='java')
and r.StudentResult>=70

-- 在上方的基础上 增加查询学生的姓名 不通过连接查询
SELECT r.StudentNo 学号,
	(select stu.StudentName from student stu WHERE stu.StudentNo=r.StudentNo) as 姓名
from Result r
	WHERE r.SubjectId=(select sb.SubjectId from `Subject` sb WHERE sb.SubjectName='java')
and r.StudentResult>=70

-- in(1,2) 返回多个结果可以用
-- 如果你的子查询 返回多个结果 记得使用in关键字 不能使用=号
SELECT r.StudentNo 学号,
	(select stu.StudentName from student stu WHERE stu.StudentNo=r.StudentNo) as 姓名
from Result r
	WHERE 
	r.SubjectId in (select sb.SubjectId from `Subject` sb WHERE sb.SubjectName='java' or sb.SubjectName='C#' )
and r.StudentResult>=70

7.常用函数

        1.字符串函数

-- 字符串函数
-- 拼接字符串
SELECT CONCAT('张三','真好','我喜欢你');

-- 转换为大写
SELECT UPPER('str')

-- 转换为小写
SELECT LOWER('QWE')

-- 截取字符串 下标:从1开始 从第几位截取到末尾
SELECT SUBSTRING('这是mysql',3)
-- 下标从1开始 从第几位开始  截取几位
SELECT SUBSTRING('这是mysql',3,5)

-- 替换字符串
SELECT REPLACE('这是mysql数据库','mysql','oracle');

        2.数学函数

-- 数学函数
-- 向上取整
SELECT CEIL(14.9);
-- 向下取整
SELECT FLOOR(14.9);
-- 四舍五入
SELECT ROUND(20.2);

        3.日期函数

-- 日期函数
-- 获取系统当前日期
SELECT NOW();
-- 获取年月日
SELECT CURRENT_DATE();
-- 获取时分秒
SELECT CURRENT_TIME();
-- 获取年份
SELECT YEAR(NOW())
-- 获取星期  周日是从1开始计算
SELECT DAYOFWEEK(NOW())

        4.聚合函数

-- 聚合函数(一般配合分组查询(GROUP BY)一起使用)
-- 求和
SELECT * from `Subject`
SELECT sum(ClassHour) from `Subject`
-- 平均分
SELECT AVG(ClassHour) FROM `Subject`
-- 最大值 
SELECT max(ClassHour) from `Subject`
-- 最小值
SELECT min(ClassHour) FROM `Subject`
-- 记录 统计  一般使用count(1)
select COUNT(*) from `Subject`

8.分组查询

-- 分组查询 
select * from Student
-- 需求 查询男女人数多少人
SELECT sex 性别,count(1) 人数
from Student
GROUP BY sex

-- 需求 查询各个年级的总课时
SELECT * from `Subject`
-- 注意: 如果聚合函数中和group by 分组中 未出现的字段,那么该字段不能加到查询字段中(没意义)'

SELECT GradeId 年级,SUM(ClassHour) 总课时
FROM `Subject`
GROUP BY GradeId
-- 你要查询的字段 要么在聚合函数中 要么就在group by 字句中
/*
SELECT GradeId 年级,SUM(ClassHour) 总课时,`Subjectname`
FROM `Subject`
GROUP BY GradeId,`Subjectname`
*/

-- 分组筛选  加条件 总课时超过100的
SELECT GradeId 年级,SUM(ClassHour) 总课时
FROM `Subject`
GROUP BY GradeId
HAVING SUM(ClassHour)>100
having 和 where 的区别(面试题)
  1. where是放在from后面 是对from查询的结果进行筛选过滤
  2. having是放在 group bu后面 是对分组查询结果进行筛选过滤
  3. having后面可以加聚合函数

(4)DCL语句(Data Control Language) 数据控制语言

        用来创建数据库用户、控制数据库的访问权限

示例: grant 、commit、rollback

八.mysql8数据类型

MySQL中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型、JSON数据类型和空间数据类型

1.数值类型

#int 整数 ->java int
#bigint 整数-> java long
#double 双精度浮点数 ->java double

2.字符串类型(注意你要使用sal语句创建表的时候 字符串类型必须加长度)

               补充: NULL值表示没有赋值 不代表空字符串

#char 类型->java中的String 固定长度的字符串
#varchar类型 ->java中的String 可变长度字符串
#text 类型-> 保存文章 或者文本比较多的一些内容

3.日期类型:

#date 类型 只可以存入年月日
#datetime类型 可以存入年月日 时分秒

4.JSON数据类型

MySQL 支持通过长 JSON 定义数据类型,可以高效访问 JSON(JavaScript 对象表示法)文档中的数据。与直接存储 JSON 格式的字符串相比,该数据类型具有很多优势如:方便查询、验证错误、优化存储结构等。

create table tb_name (col_name json);  # JSON 数据类型示例
insert into tb_name values ('{"key1": "value1", "key2": "value2", "key3": "value3"}');

5.空间数据类型

MySQL 具有对应于 OpenGIS 类的空间数据类型。MySQL8 空间数据类型包含单个几何值:GEOMETRY、POINT、LINESTRING、POLYGON

create table tb_name (col_name GEOMETRY);  #GEOMETRY 数据类型示例

九.列的属性:

1.UNSIGNED 无符号 不允许出现负数(unsigned)
2.ZEROFILL (zerofill)如果不知指定的长度 自动在前方补充0	如果设定为该属性 自动添加1 .UNSIGNED属性
3.auto_increment 自动增长列 设定它请保证你的列是主键列 并且是整数
				主键列:能够唯一标识某个数据表的数据列
				主要设置为之间 那么这一列数据 必须是非空 且唯一
4.NOT NULL(not null) 表示该列的不允许为空

十.列的注释(说明):

comment'注释;//给列注释 或者给表注释 

十一.数据库表类型:InnoDB 、MyISAM 、BOB、CSV等

MyISAM 和 InnoDB的区别

十二.主键与外键

主键:用来唯一标识数据库表里某条数据的字段

外键:一张表的某个字段引用着另一张表中某个字段的信息

外键可以保证数据的合理性、和完整性

-- 添加外键 让Student和Grade表建立关系
-- 因为我们是关系型数据库,一般我们需要建立表关系
-- 建立表关系后,可以保证数据的合理性、完整性
ALTER TABLE Student
	ADD CONSTRAINT fk_student_grade
		FOREIGN key (gradeId)
			REFERENCES Grade(gradeId)

-- 删除外键
ALTER TABLE student DROP FOREIGN key fk_student_grade

在大型项目中我们一般不采用物理外键,而采用逻辑外键

举例: 张三和李四,不领证 但是实为为夫妻

十三.MySQL中的运算符

算数运算符: + - * / %

赋值运算符: =

比较/关系运算符 =(判断相等) > < >= <= <>/!= between and(在xxx和xxx之间)(等价于= and <=)

逻辑运算符: and并且 or或者 not非 也可以用&&并且 || 或者

注意: 在mysql中 =号既是赋值符号 也是 判断相等的符号 没有java中的==

十四.MySQL中的缩写

PK主键
FK外键、
DF默认约束、
CK检查约束

十五.掌握事务的处理方法

事务的概念:事务就是将一组SQL语句放在同一批次内去执行 要么同时成功 要么同时失败执行一系列sql语句

innoDB(支持事务) MyISAM 不支持

mysql 事务默认情况下是自动提交,你执行一行sql语句,执行完之后mysql帮你自动提交

try{
	//1.张三减去500
	//2.李四增加500
	//3.提交事务 commit;
}catch(Exception e){
rol1back;//回滚 把数据返还回去
}
-- 张三 要给 李四转账

BEGIN;-- 开始事务
	UPDATE MyBank 
	SET money=money-500
	WHERE `name`='张三'
-- 转账的过程中可能出现 宕机
-- 回滚事务
ROLLBACK;-- 会提交一次事务
	UPDATE MyBank 
	SET money=money+500
	WHERE `name`='李四'
-- 提交事务
COMMIT;


-- 设置你的事务手动提交
SET autocommit=0;
-- 开启自动提交
SET autocommit=1;

insert INTO MyBank
VALUES(3,'沾上干',8000);

#qwewqewq
-- 检验 delete 和 truncate 对事务的影响
-- DELETE 和 truncate
BEGIN; -- 开启事务
-- DELETE from MyBank WHERE name='沾上干';
TRUNCATE TABLE MyBank -- 会自动提交事务
ROLLBACK;
COMMIT;

-- DDL语句 create、 DROP、alter
-- DDL语句 会自动提交事务
BEGIN;
DELETE from MyBank WHERE name='王五';
create DATABASE ooo;

十六.掌握事务的ACID原则(面试题)

A:原子性:

在化学中我们知道,原子是理论中最小的单元,不可被分隔(事务是不可分隔,这一系列sgli语句要么全部执行成功,要么全都不执行)

C:一致性:

在事务的执行过程中,数据无论怎么操作,最后的总量一定是一致的

比如: 张三给李四转账(两人没有操作之前,加起来是1500),当转账结束后,最后的余额加起来也应该是1500元

如果出现了变化,则说明事务违背了一致性原则

I: 隔离性:

事务的并发影响

1.脏读:

一个事务读取到了另一个事务中未提交的内容(任何数据库都不允许出现这个问题)

2.不可重复读

在一个事务中,读取了同一块数据多次,结果数据却不一样

(是因为其他的事务对该数据进行了更新update)

可以让你读数据,但是它指的是: 在事务读取数据时,其他的事务不能对该数据进行修改

从而保证事务读取的的数据都是稳定的,不会被其他事务的修改所影响

3.幻读(虚读):

在一个事务中 对整张表进行了更新,结果另一个事务又插入了一条新的数据,导致第一个事务再次查看结果时

发现还有未更新的内容(针对于其他事务进行插入的操作insert)

为了解决上述的并发事务影响,不同的数据库设置了不同的隔离级别

  1. Serializable(串行化):可避免脏读、不可重复读、幻读的发生 性能最差的!
  2. Repeatable read(可重复的):可避免脏读、不可重复读的发生 mysql默认的
  3. Read committed(读已提交): 可避免脏读的发生 oracle默认的]
  4. Read uncommitted(读未提交)最低隔离级别 任何情况下都无法保证,性能最好,但是我们知道最低不允许脏读的发生!!!(所以这种方式我们不设定)

D:持久性

当事务结束后,应该将数据持久化到数据库中

十七.视图

是一张虚拟表 表示一张表的部分数据或者一堆表的综合数据

如果你经常查询很多在不同数据表中的数据,建议你新建一个视图,方便你每次查看数据

-- 老师想查看某个学生的考试信息  姓名、考试科目、考试成绩
SELECT stu.studentName 学生姓名,sb.SubjectName 科目名称, r.StudentResult 成绩
from student stu,`SUBJECT` sb,result r
WHERE stu.studentno = r.StudentNo
and sb.SubjectId = r.SubjectId
and sb.SubjectName='java'

-- 制作为视图
CREATE VIEW student_score 
	AS
		SELECT stu.studentName 学生姓名,sb.SubjectName 科目名称, r.StudentResult 成绩
		from student stu,`SUBJECT` sb,result r
		WHERE stu.studentno = r.StudentNo
		and sb.SubjectId = r.SubjectId

SELECT * from student_score

-- 删除视图
drop VIEW student_score

-- 查看所有的视图
-- 如果你在dos窗口查询视图 加\G
USE information_schema
SELECT * FROM views;

十八.索引 优化数据库 提高查询速度

索引的作用:大大提高数据库的检索速度 改善数据库的性能

索引的分类:

  1. 普通索引: 提升查询速度
  2. 唯一索引: 在提升查询速度之外,还保证了数据不允许出现重复(unique)唯一约束
  3. 主键索引:在.........之外,还保证了数据唯一且非空(设置主键时自动添加主键索引)
  4. 复合索引: 多个列之间的组合(注意:你设置的顺序是怎么样的,查询是顺序也需要一致)

十九.掌握数据库的备份与恢

1.备份数据库

利用mysql的mysqldump.exe程序导出myschool数据库中的所有表

mysqldump -uroot-proot 数据库名 >d:\myschool.sql

2.恢复数据库

方式一:利用mysql的mysql.exe 程序恢复导出的数据 mysql-uroot-proot 数据库名< sql脚本路径

方式二: 利用mysql的命令source恢复数据

恢复注意事项

  1. 必须确认数据库存在
  2. 需要切换到恢复的数据库中 use 数据库名
  3. 语法: source 要恢复的数据库脚本路径(别写错了!!!)

工具中的导出和恢复数据

-- 导出数据
查询语句 into outfile数据库文件存放地址

-- 恢复数据
load data infile'数据库文件地址' into table 表名

二十.数据库设计的概念

  1. 数据库设计就是根据咱们业务的具体要求,选择合适的DBMS 为这个业务打造出最优的存储模型
  2. 建立数据库中的表结构 和 表与表之间的关系
  3. 有哪些表 表里面有什么字段 表和表之间的关系

二十一.数据库设计的步骤

  1. 需求分析(数据是什么? 数据有哪些属性?)
  2. 逻辑分析((比如之前是通过ER图对数据库进行逻辑建模,现在直接分析表关系)
  3. 物理设计(根据数据库自己的特点把逻辑转换为物理设计)
  4. 维护设计(表建立成功 表优化)

二十二.表关系

1.一对一:

比如:你的用户表 要分为 用户详情表 用户基本表

一对一关系多用于表的拆分,将一个实体中经常使用的字段放入一张表,不经常使用的字段放入另一张表,用于提高查询性能

编号 姓名 微信名 微信号 收货地址 绑定的银行卡 身份证号

用户详情表: 编号 姓名 微信名 微信号 收货地址 绑定的银行卡 身份证号

用户基本表: 姓名 微信号 微信名 用户编号(唯一)

一对一的情况

2.一对多(多对一):(注意:在多的一方建立外键,1的一方为主键)

学生表(Student)(Gradeid) 年级表(Grade)(Gradeid)

                N                                         1

        员工信息表                                 部门表

                N                                           1

        学生表                                            年级表

    编号 姓名 年龄                         年级编号 年级编号

3.多对多:

商品 和 订单信息

一个商品对应多个订单 一个订单可以有多个商品

实现方式: 如果要实现多对多的关系 需要建立第三张表(中间表),中间表至少包含两个外键,分别关联其他两个表的主键

                订单: order                                              商品goods

编号 总金额 支付方式 支付状态                 编号 商品名称 商品价格

                1                                                                     1

                2                                                                      2

                                                  中间表:

                                        编号 订单编号 商品编号

                                          1            1              2

                                          2            1               1

                                          3             2              1

二十三.数据库设计的三大范式

注意: 第三范式是建立在第二范式的基础上 第二范式是建立在第一范式基础上 层层递进,也就是说你不满足第一范式 后面的肯定不满足

还有就是如果想满足后面的范式 必须从第一个开始满足

  1. 第一范式(1NF)确保每一列都是不可再分的原子列,告诉你每个字段都应该只包含一个值,不能包含多个值或者子字段.

    例如一个姓名和地址的字段应该被拆分为链各个字段 分别存储姓名和地址

  2. 第二范式(2NF)在满足第一范式的基础上,确保每一个非主键字段完全依赖于主键,就是说每个非主键字段,都应该由主键唯一确定,不能有部分依赖,

                                                                student
                                                  编号  姓名 地址 电话 课程

                                                 1      张三  北京 132  java

                                                 2     李四 湖南 456   C

                                                 3    王五 海南  999 java

        3,第三范式:(3NF)在满足第二范式的基础上,确保每个非主键字段都不传递依赖于主键,就是说每个非主键字段都应该直接依赖于主键,而不是通过其他非主键字段间接依赖于主键

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值