第七篇 SQL从安装到卸载
作者:互联网
什么是数据库
数据库 DataBase 简称db
数据库管理系统 DataBase Management System 简称DBMS
sql是非过程化语言
创建时间和更新时间的默认值 CURRENT_TIMESTAMP
数据库设计过程阶段
按照规范的设计方法,一个完成的数据库设计一般分为以下六个阶段:
1. 需求分析: 分析用户的需求,包括数据、功能和性能需求;
2. 概念结构设计:主要采用E-R模型进行设计,包括画E-R图;
3. 逻辑结构设计:通过将E-R图转换成表,实现从E-R模型到关系模型的转换,进行关系规范化;
4. 数据库物理设计:主要是为所设计的数据库选择合适的存储结构和存储路径;
5. 数据库的实施:包括编程、测试和试运行;
6. 数据库运行和维护:系统的运行和数据库的日常维护
完整性描述
实体完整性指表中行的完整性
域完整性指列的值域的完整性,如数据类型、格式、值域范围、是否允许空值等等
参照完整性基于外键与被引用主键之间的关系,确保键值在所有表中的一致性
三个模式
在数据库的三级模式结构中:
模式也称为逻辑模式或概念模式;
外模式也称为用户模式;
内模式也称为物理模式或存储模式。
三个模型
层次模型:用树状<层次>结构来组织数据的数据模型
网状模型:用有向图表示实体和实体之间的联系的数据结构模型
关系模型:使用表格表示实体和实体之间关系的数据模型
数据表的逻辑运算
投影得到元组
选取得到列
连接在多个关系的笛卡尔积中进行筛选出的新关系
交运算是多个关系之间交集所产生的新的关系。
下载安装
软件下载
步骤
1、下载后得到zip压缩包.
2、解压到自己想要安装到的目录,
3、添加环境变量:我的电脑->属性->高级->环境变量
选择PATH,在其后面添加: 你的mysql 安装文件下面的bin文件夹
4、编辑 my.ini 文件 ,注意替换路径位置
[mysqld]
basedir=D:\Program Files\mysql-5.7\
datadir=D:\Program Files\mysql-5.7\data\
port=3306
skip-grant-tables
5、启动管理员模式下的CMD,并将路径切换至mysql下的bin目录,然后输入mysqld –install (安装mysql)
6、再输入 mysqld --initialize-insecure --user=mysql 初始化数据文件
7、然后再次启动mysql 然后用命令 mysql –u root –p 进入mysql管理界面(密码可为空)
8、进入界面后更改root密码
update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost';
9 刷新权限
flush privileges;
10、修改 my.ini文件删除最后一句skip-grant-tables
11、重启mysql即可正常使用
net stop mysql
net start mysql
12、连接上测试出现以下结果就安装好了
mysql -uroot -p123456
13 连接数据库语句 : mysql -h 服务器主机地址 -u 用户名 -p 用户密码
基本命令
update user set password=password('123456')where user='root'; --修改密码
flush privileges; --刷新数据库
show databases; --显示所有数据库
use dbname; --打开某个数据库
show tables; --显示数据库mysql中所有的表
describe user; --显示表mysql数据库中user表的列信息
create database name; --创建数据库
use databasename; --选择数据库
exit; 退出Mysql
sc delete mysql; 清空服务 安装失败的时候使用
? 命令关键词
: 寻求帮助
-- 表示注释
DDL 数据定义语言
创建数据库
创建数据库 : create database [if not exists] 数据库名;
删除数据库 : drop database [if exists] 数据库名; 可选属性 判断是否存在
查看数据库 : show databases;
使用数据库 : use 数据库名;
创建表
sqlyog
CREATE TABLE IF NOT EXISTS `student` (
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名' ,
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=UTF8
总结
加``是为了防止转义字符的出现 方式表明未识别
SHOW CREATE DATABASE school --查看创建数据库的语句
SHOW CREATE TABLE student --查看student数据表的定义语句
DESC student --显示表的结构
数据字段类型
UnSigned
- 无符号的
- 声明该数据列不允许负数 .
ZEROFILL
- 0填充的
- 不足位数的用0来填充 , 如int(3),5则为005Auto_InCrement
- 自动增长的 , 每添加一条数据 , 自动在上一个记录数上加 1(默认)
- 通常用于设置主键 , 且为整数类型
- 可定义起始值和步长
- 当前表设置步长(AUTO_INCREMENT=100) : 只影响当前表
- SET @@auto_increment_increment=5 ; 影响所有使用自增的表(全局)
NULL 和 NOT NULL
- 默认为NULL , 即没有插入该列的数值
- 如果设置为NOT NULL , 则该列必须有值
DEFAULT
- 默认的
- 用于设置默认值
例如,性别字段,默认为"男" , 否则为 “女” ; 若无指定该列的值 , 则默认值为"男"的值
mysql数据表的类型
经验
- 使用MyiSAM:节约空间及相应速度
- 适用于InnoDB:安全性 事务处理及多用户操作数据表
DML数据操作语言
插入数据
INSERT INTO 表名[(字段1,字段2,字段3,…)] VALUES(‘值1’,‘值2’,‘值3’)
INSERT INTO grade(gradename) VALUES (‘大三’),(‘大四’);
外键
CREATE TABLE `grade` (
`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级ID',
`gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
PRIMARY KEY (`gradeid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
修改数据
UPDATE 表名 SET column_name=value [,column_name2=value2,…] [WHERE condition];
UPDATE grade SET gradename = ‘高中’ WHERE gradeid = 1;
where语句
删除数据
DELETE FROM 表名 [WHERE condition];
– 删除最后一个数据
DELETE FROM grade WHERE gradeid = 2
Truncate命令
作用:用于完全清空表数据 , 但表结构 , 索引 , 约束等不变 ;
语法:
TRUNCATE [TABLE] table_name;
-- 清空年级表
TRUNCATE grade
区别:注意:区别于DELETE命令
- 相同 : 都能删除数据 , 不删除表结构 , 但TRUNCATE速度更快
- 不同 :
- 使用TRUNCATE TABLE 重新设置AUTO_INCREMENT计数器
- 使用TRUNCATE TABLE不会对事务有影响 (事务后面会说
DQL数据查询语言
select语法
SELECT [ALL | DISTINCT]
{* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
FROM table_name [as table_alias]
[left | right | inner join table_name2] -- 联合查询
[WHERE ...] -- 指定结果需满足的条件
[GROUP BY ...] -- 指定结果按照哪几个字段来分组
[HAVING] -- 过滤分组的记录必须满足的次要条件
[ORDER BY ...] -- 指定查询记录按一个或多个条件排序
[LIMIT {[offset,]row_count | row_countOFFSET offset}];
-- 指定查询的记录从哪条至哪条
where逻辑操作符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I1s5SigW-1606473148121)(E:/Typora/image/1606395610488.png)]
查询多个数据
SELECT studentno,studentname FROM student;
统计表中有多少条数据
select count(*) from student
骚操作
发现重复数据 去重
重复的数据只显示一条
SELECT DISTINCT `StudentNO` FROM result
数据库表达式
数据库表达式:文本值 列 Null 函数 计算表达式 系统变量
模糊查询
between and \ like \ in \ null
模糊搜索查询
WHERE studentname LIKE ‘%嘉%’;
查询学号为1000,1001,1002学生的成绩
WHERE studentno IN (1000,1001,1002);
查询BornDate为空的字段
WHERE BornDate IS NULL;
as字句取别名
作用:
- 可给数据列取一个新别名
- 可给表取一个新别名
- 可把经计算或总结的结果用另一个新名称来代替
-- 这里是为列取别名(当然as关键词可以省略)
SELECT studentno AS 学号,studentname AS 姓名 FROM student;
-- 使用as也可以为表取别名
SELECT studentno AS 学号,studentname AS 姓名 FROM student AS s;
-- 使用as,为查询结果取一个新名字
-- CONCAT()函数拼接字符串
SELECT CONCAT('姓名:',studentname) AS 新姓名 FROM student;
连接查询
join
- INNER JOIN 如果表中有至少一个匹配,则返回行
- LEFT JOIN 即使右表中没有匹配,也从左表中返回所有的行
- RIGHT JOIN 即使左表中没有匹配,也从右表中返回所有的行
key值为两个表相连的中间值 相等即为连接
select_list 需要查询的信息:查询条件和中间值
TableA A 给表起别名 as可以省略
自连接
先把自己拆成两个表 然后进行连接查询(有先行课的情况下需要进行自链接)
复制一份以后 判断条件 id=他先行课的id
子查询
在where语句中嵌套一个语句
比较一下连接查询和子查询的区别
从里向外查询(先执行最里面在执行外面
分页和排序
瀑布流:eg:抖音无限往下刷新
显示表中前5条数据
limit 页数,页面大小
select * from student limit 0,5
排序
ORDER BY 要排序的字段 DESC|ASC --降序|升序
mysql函数
常用函数
数学运算
SELECT ABS(-8) --取绝对值
SELECT CTILING(9.4) --向上取整
SELECT FlOOR(9.4) --向下取整
SELECT RAND() --取随机数
SELECT SIGN(10) --返回一个数的符号 正数返回1 负数返回-1
字符串函数
SELECT CHAR_LENGTH('') --返回字符串的长度
SELECT CONCAT('我','你') -- 拼接字符串
SELECT INSERT('str',1,2,'str1') --从第一个字符开始,将str的两个字符替换成str1
SELECT LOWER('') --转换成小写
SELECT UPPER('') --转换成大写
INSTR 返回第一次出现的字串的索引
时间和日期函数
聚合函数
- COUNT() 计数
- count(data) 会忽略所有的null值
- count(*) 计算行数 所有列都会查
- count(1) 计算行数 只会查一列
- SUM() 求和
- AVG() 平均值
- MAX() 最大值
- MIN() 最小值
GROUP BY 字段名 通过什么来分组
HAVING 二次过滤
MD5函数
增强算法复杂度和不可逆性
加密算法
UPDATE testmd5 SET pwd=MD5(pwd) WHERE id =1
插入时加密
INSERT INTO testmd5 VALUES(4,‘xiaoming’,MD5(‘123456’))
如何校验 将用户传入数据库的密码 进行MD5加密
SELECT * FROM testmd5 WHERE `name`='xiaoming' AND pwd=MD5('123456')
事务
将一组sql放在一个批次中去执行,要么都成功要么都失败
CAP原则
1.1 定义
CAP是“Consistency,Avalilability, Partition Tolerance”的一种简称,其内容分别是:
(1)强一致性:即在分布式系统中的同一数据多副本情形下,对于数据的更新操作体现出的效果与只有单份数据是一样的。
(2)可用性:客户端在任何时刻对大规模数据系统的读/写操作都应该保证在限定延时内完成;
(3)分区容忍性:在大规模分布式数据系统中,网络分区现象,即分区间的机器无法进行网络通信的情况是必然发生的,所以系统应该能够在这种情况下仍然继续工作。
对于一个大规模分布式数据系统来说,CAP三要素是不可兼得的,同一系统至多只能实现其中的两个,而必须放宽第3个要素来保证其他两个要素被满足。一般在网络环境下,运行环境出现网络分区是不可避免的,所以系统必须具备分区容忍性§特性,所以在一般在这种场景下设计大规模分布式系统时,往往在AP和CP中进行权衡和选择。
1.2 为什么分布式环境下CAP三者不可兼得呢?
由于上面已经提到对于分布式环境下,P是必须要有的,所以该问题可以转化为:如果P已经得到,那么C和A是否可以兼得?可以分为两种情况来进行推演:
(1) 如果在这个分布式系统中数据没有副本,那么系统必然满足强一致性条件,因为只有独本数据,不会出现数据不一致的问题,此时C和P都具备。但是如果某些服务
器宕机,那必然会导致某些数据是不能访问的,那A就不符合了。
(2) 如果在这个分布式系统中数据是有副本的,那么如果某些服务器宕机时,系统还是可以提供服务的,即符合A。但是很难保证数据的一致性,因为宕机的时候,可能
有些数据还没有拷贝到副本中,那么副本中提供的数据就不准确了。
所以一般情况下,会根据具体业务来侧重于C或者A,对于一致性要求比较高的业务,那么对访问延迟时间要求就会低点;对于访问延时有要求的业务,那么对于数据一致性要求就会低点。一致性模型主要可以分为下面几类:强一致性、弱一致性、最终一致性、因果一致性、读你所写一致性、会话一致性、单调读一致性、以及单调写一致性,所以需要根据不同的业务选择合适的一致性模型。
ACID原则
(1) 原子性(Atomicity):是指一个事务要么全部执行,要么完全不执行。
(2) 一致性(Consistency): 事务在开始和结束时,应该始终满足一致性约束。比如系统要求A+B=100,那么事务如果改变了A的数值,则B的数值也要相应修改来满足这样一致性要求;与CAP中的C代表的含义是不同的。
最终一致性,银行转钱,无论怎么转,钱的数量一致,
(3) 隔离性(Isolation):如果有多个事务同时执行,彼此之间不需要知晓对方的存在,而且执行时互不影响,事务之间需要序列化执行,有时间顺序。
事务的独立性,互相隔离,互不干扰
(4) 持久性(Durability):事务的持久性是指事务运行成功以后,对系统状态的更新是永久的,不会无缘无故回滚撤销。
没有提交事务回滚,提交事务不可逆
脏读:一个事务读取了另外一个事务未提交的数据 隔离性的问题
不可重复读:多次读取结果不同
幻读:一个事务读取到了另外一个事务插入的数据,导致前后读取不一致(一般是行影响 多了一行)
索引
mysql为什么使用b+树 减少磁盘访问 io的问题 优先把根节点加载到内存中 加载索引 尽量不要增加树深
olap 对历史数据的分析
oltp 传统的数据库用的是这个
局部性原理和磁盘预读(了解) 加载的时候以页(4k)为单位进行交换 innodb是以块读 16k
索引是什么
存储引擎:innodb文件 两个ibd文件将数据和索引存储在一起 聚簇索引
mylsam myd 存储数据 索引在 myi 非聚簇索引
frm存储表结构
hash为什么不行
hash冲突:而且容易造成空间的浪费 进行范围查找需要一条条数据进行对比
二叉树为什么不行
层级问题(树太高) io量太大
尽量在开发中sql不要写*
用二分查找需要将二叉树变成二叉搜索树 BST-》可是数据如果递减的话,树可能就退还成了链表,左分支空-》 avl树 (最长子树和最短子树高度相差1)平衡二叉树-》需要进行树的旋转 插入性能低 查询性能高
红黑树
红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。 [3] 在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:
- 性质1. 节点是红色或黑色。
- 性质2. 根节点是黑色。
- 性质3.所有叶子都是黑色。(叶子是NUIL节点)
- 性质4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
- 性质5… 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
b树
一层一个根节点下超过两个元素就往上添加 -》2²-1个值插进来的时候会影响树高
b+树
数据都在叶子节点 非叶子节点只存储key值(索引) 叶子之间是双向链表
概念
索引分类:
根据存储来分:聚簇索引和非聚簇索引
根据是用来分:
-
主键索引 根据主键查找
-
唯一索引 给列添加一个唯一索引 可以根据该列来查找
-
普通索引 回表 索引覆盖
-
组合索引 最左匹配:
什么时候会有索引失效:
- like查询%开头
- 组合索引如果中间某一个值进行了范围查询也会失效
- 使用函数的时候会失效
- 使用表达式的时候会失效
- 类型不匹配的时候会失效 设及隐式转换的时候会失效
- 数据量特别大也会失效
- 在某情况下会失效
-
全文索引
回表
当存在主键索引和普通索引时,根据普通索引的b+树找到数据,返回主键值,根据主键取索引树找对应的值
索引覆盖
根据name索引已经查出了数据 不需要在根据age去查这个数据了
索引下推
谓词下推 join有三种连接方式(了解)
1 先从存储引擎中把所有符合name的数据拉取回来 然后再server层进行age筛选
2 从存储引擎拉去数据的时候把name和age都做了筛选
最左匹配
eg 选地址必须先选择省 在选择市 在选择地区 不能直接选择地区
数据库三大范式
-
1NF 只要有不重复的组就可以(就是说每一列都不可再分)
-
2NF 满足第一范式 所有非主属性都完全依赖于主码
- 包含在任意一个码中的属性被称为主属性
- 解决数据冗余和插入异常的问题
- 你创建一个学生表 关系模型(班级编号,班级名称,学号,姓名,老师id,老师名称)这种是不合理的
- 通过你的id可以找到你,这是完全依赖,
- 通过你可以找到你老师 通过你同班同学一可以找到你老师 这是部分依赖 这种情况就需要分表
- 判断是否属于2范式
- 第一步:找出数据表中所有的码。
- 第二步:根据第一步所得到的码,找出所有的主属性。
- 第三步:数据表中,除去所有的主属性,剩下的就都是非主属性了。
- 第四步:查看是否存在非主属性对码的部分函数依赖
-
3NF 满足第二范式 所有非主属性对任何候选码都不存在传递依赖
- 解决插入异常,修改异常与删除异常的问题
- 每个属性都跟主键有直接关系而不是间接关系
- 你创建一个学生表 关系模型(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)
- 你和你学校电话存在传递依赖 (间接关系)你-》你学校-》学校电话
-
BCNF 解决了主属性对于码的部分函数依赖与传递函数依赖。
-
码的定义 K 确定的情况下,该表除 K 之外的所有属性的值也就随之确定,那么 K 就是码
-
码有主码和候选码 意味着码存在多个
-
满足BCNF’的条件
1 所有非主属性对每一个候选键都是完全函数依赖; 满足2NF
2 所有的主属性对每一个不包含它的候选键,也是完全函数依赖;
3 没有任何属性完全函数依赖于非候选键的任何一组属性。 满足2NF
-
范式小结
1NF:关系中的每个属性都不可分。列的原子性
2NF:消除了非主属性对于码(键)的部分函数依赖。
3NF:消除了非主属性对于码(键)的传递函数依赖。
BCNF:消除了主属性对于码(键)的部分或传递函数依赖。
exe安装完全卸载
运行安装mysql-server 右上角安装程序,点击Remove进行卸载。
删除mysql目录 C:\Program Files\MySQL
检查C:\WINDOWS目录下是否有my.ini文件,将其删除 这个文件不一定存在
win+r,弹出运行程序窗口,然后输入regedit
删除 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MySQL
如下两个key不一定有,没有就不理了 删除
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Eventlog\Application \MySQL
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\MySQL
删除ProgramData目录下的文件 C:\ProgramData\MySQL Server 5.5
标签:SQL,--,数据库,mysql,第七篇,索引,卸载,数据,SELECT 来源: https://blog.csdn.net/qq_41315339/article/details/110240144