一.SQL语言
1.SQL语言基础概述
SQL(Structured Query Language):结构化查询语言,用于访问和处理数据库的标准的计算机语言
2.SQL特点
-
具有综合统一性,不同数据库的支持的SQL稍有不同
-
非过程化语言
-
语言简洁,用户容易接受
-
以一种语法结构提供两种使用方式
3.SQL语法特点
-
SQL对关键字的大小写不敏感
-
SQL语句可以以单行或者多行书写,以分号结束
-
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的特点
- MySQL数据库是用C和C++语言编写的,以保证源码的可移植性;
- 支持多个操作系统,例如:Windows、Linux、Mac OS等;
- 支持多线程,可以充分的利用CPU资源;
- 为多种编程语言提供API,包括C语言,Java,PHP,Python语言等;
- MySQL优化了SQL算法,有效的提高了查询速度;
- MySQL开放源代码且无版权制约,自主性强、使用成本低;
- 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通用语法
- SQL语句可以单行或多行书写,以分号结尾;
- SQL语句可以使用空格/缩进 来增强语句的可读性;
- MySQL数据库的SQL语句不区分大小写,关键字建议使用大写;
- 注释: 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的区别:
- 都可以直接删除表中的数据
- delete可以加where条件,truncate不可以添加条件
- delete删除之后,会保auto increment的自增序列,而truncate会清空 从新开始标注
- 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 的区别(面试题)
- where是放在from后面 是对from查询的结果进行筛选过滤
- having是放在 group bu后面 是对分组查询结果进行筛选过滤
- 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)
为了解决上述的并发事务影响,不同的数据库设置了不同的隔离级别
- Serializable(串行化):可避免脏读、不可重复读、幻读的发生 性能最差的!
- Repeatable read(可重复的):可避免脏读、不可重复读的发生 mysql默认的
- Read committed(读已提交): 可避免脏读的发生 oracle默认的]
- 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;
十八.索引 优化数据库 提高查询速度
索引的作用:大大提高数据库的检索速度 改善数据库的性能
索引的分类:
- 普通索引: 提升查询速度
- 唯一索引: 在提升查询速度之外,还保证了数据不允许出现重复(unique)唯一约束
- 主键索引:在.........之外,还保证了数据唯一且非空(设置主键时自动添加主键索引)
- 复合索引: 多个列之间的组合(注意:你设置的顺序是怎么样的,查询是顺序也需要一致)
十九.掌握数据库的备份与恢
1.备份数据库
利用mysql的mysqldump.exe程序导出myschool数据库中的所有表
mysqldump -uroot-proot 数据库名 >d:\myschool.sql
2.恢复数据库
方式一:利用mysql的mysql.exe 程序恢复导出的数据 mysql-uroot-proot 数据库名< sql脚本路径
方式二: 利用mysql的命令source恢复数据
恢复注意事项
- 必须确认数据库存在
- 需要切换到恢复的数据库中 use 数据库名
- 语法: source 要恢复的数据库脚本路径(别写错了!!!)
工具中的导出和恢复数据
-- 导出数据
查询语句 into outfile数据库文件存放地址
-- 恢复数据
load data infile'数据库文件地址' into table 表名
二十.数据库设计的概念
- 数据库设计就是根据咱们业务的具体要求,选择合适的DBMS 为这个业务打造出最优的存储模型
- 建立数据库中的表结构 和 表与表之间的关系
- 有哪些表 表里面有什么字段 表和表之间的关系
二十一.数据库设计的步骤
- 需求分析(数据是什么? 数据有哪些属性?)
- 逻辑分析((比如之前是通过ER图对数据库进行逻辑建模,现在直接分析表关系)
- 物理设计(根据数据库自己的特点把逻辑转换为物理设计)
- 维护设计(表建立成功 表优化)
二十二.表关系
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
二十三.数据库设计的三大范式
注意: 第三范式是建立在第二范式的基础上 第二范式是建立在第一范式基础上 层层递进,也就是说你不满足第一范式 后面的肯定不满足
还有就是如果想满足后面的范式 必须从第一个开始满足
-
第一范式(1NF)确保每一列都是不可再分的原子列,告诉你每个字段都应该只包含一个值,不能包含多个值或者子字段.
例如一个姓名和地址的字段应该被拆分为链各个字段 分别存储姓名和地址
-
第二范式(2NF)在满足第一范式的基础上,确保每一个非主键字段完全依赖于主键,就是说每个非主键字段,都应该由主键唯一确定,不能有部分依赖,
student
编号 姓名 地址 电话 课程
1 张三 北京 132 java
2 李四 湖南 456 C
3 王五 海南 999 java
3,第三范式:(3NF)在满足第二范式的基础上,确保每个非主键字段都不传递依赖于主键,就是说每个非主键字段都应该直接依赖于主键,而不是通过其他非主键字段间接依赖于主键