ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

第七篇 SQL从安装到卸载

2020-11-27 18:57:53  阅读:252  来源: 互联网

标签:SQL -- 数据库 mysql 第七篇 索引 卸载 数据 SELECT


狂神说Java

什么是数据库

数据库 DataBase 简称db 
数据库管理系统 DataBase Management System 简称DBMS 
sql是非过程化语言
创建时间和更新时间的默认值   CURRENT_TIMESTAMP

数据库设计过程阶段

按照规范的设计方法,一个完成的数据库设计一般分为以下六个阶段:
1. 需求分析: 分析用户的需求,包括数据、功能和性能需求;
2. 概念结构设计:主要采用E-R模型进行设计,包括画E-R图;
3. 逻辑结构设计:通过将E-R图转换成表,实现从E-R模型到关系模型的转换,进行关系规范化;
4. 数据库物理设计:主要是为所设计的数据库选择合适的存储结构和存储路径;
5. 数据库的实施:包括编程、测试和试运行;
6. 数据库运行和维护:系统的运行和数据库的日常维护

完整性描述

实体完整性指表中行的完整性
域完整性指列的值域的完整性,如数据类型、格式、值域范围、是否允许空值等等
参照完整性基于外键与被引用主键之间的关系,确保键值在所有表中的一致性

三个模式

在数据库的三级模式结构中:
模式也称为逻辑模式或概念模式;
外模式也称为用户模式;
内模式也称为物理模式或存储模式。

三个模型

 层次模型:用树状<层次>结构来组织数据的数据模型
 网状模型:用有向图表示实体和实体之间的联系的数据结构模型
 关系模型:使用表格表示实体和实体之间关系的数据模型

数据表的逻辑运算

投影得到元组 
选取得到列
连接在多个关系的笛卡尔积中进行筛选出的新关系
交运算是多个关系之间交集所产生的新的关系。

下载安装

软件下载

mysql5.7 64位下载地址

步骤

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 即使左表中没有匹配,也从右表中返回所有的行

img

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 选地址必须先选择省 在选择市 在选择地区 不能直接选择地区

数据库三大范式

  1. 1NF 只要有不重复的组就可以(就是说每一列都不可再分)

  2. 2NF 满足第一范式 所有非主属性都完全依赖于主码

    1. 包含在任意一个码中的属性被称为主属性
    2. 解决数据冗余和插入异常的问题
    3. 你创建一个学生表 关系模型(班级编号,班级名称,学号,姓名,老师id,老师名称)这种是不合理的
      1. 通过你的id可以找到你,这是完全依赖,
      2. 通过你可以找到你老师 通过你同班同学一可以找到你老师 这是部分依赖 这种情况就需要分表
    4. 判断是否属于2范式
      1. 第一步:找出数据表中所有的码。
      2. 第二步:根据第一步所得到的码,找出所有的主属性。
      3. 第三步:数据表中,除去所有的主属性,剩下的就都是非主属性了。
      4. 第四步:查看是否存在非主属性对码的部分函数依赖
  3. 3NF 满足第二范式 所有非主属性对任何候选码都不存在传递依赖

    1. 解决插入异常,修改异常与删除异常的问题
    2. 每个属性都跟主键有直接关系而不是间接关系
    3. 你创建一个学生表 关系模型(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)
    4. 你和你学校电话存在传递依赖 (间接关系)你-》你学校-》学校电话
  4. BCNF 解决了主属性对于码的部分函数依赖与传递函数依赖。

    1. 码的定义 K 确定的情况下,该表除 K 之外的所有属性的值也就随之确定,那么 K 就是码

    2. 码有主码和候选码 意味着码存在多个

    3. 满足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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有