第二阶段2-数据库二(mysql)

3 篇文章 0 订阅
2 篇文章 0 订阅

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


Mysql

1.安装和卸载

2.基本命令

show databases; --查看所有的数据库
use 数据库名字; --打开指定的数据库
show tables; --查看当前库下所有的表
desc 表名; --查看指定的表的表结构
create database 数据库名;--创建数据库
exit;退出界面

3.操作数据库

--1.创建数据库
CREATE DATABASE [IF NOT EXISTS] 数据库名;
--2.删除数据库
DROP DATABASE [IF EXISTS] 数据库名;
--3.使用数据库  如果数据库名字存在特殊字符 最好使用单引号把数据名括起来
USE 数据库名

4.数据库类型

数值:

数据类型描述大小
tinyint最小的数值1字节
smallint数值2
mediumint数值3
int标准的整型4
bigint超大的整形8
float浮点型4
double浮点型8
decimal字符串形式的浮点数

字符:

数据类型描述大小
char固定长度字符串0-255
varchar可变字符串0-65535
tinytext微型文本2的8次方-1
text文件2的16次方-1

日期:

数据类型描述格式
date日期格式YYYY-MM-DD
time时间格式HH:mm:ss
datetime日期时间格式YYYY-MM-DD HH:mm:ss
timestamp时间戳1970.1.1到现在的毫秒数
year年份

null:

没有值。

5.字段属性

属性描述
UNSIGNED声明该列不能为负数
ZEROFILL不足的位数用0填充。 int(4) 存储的是12则为0012
auto_increment自增。在上一条的基础上+1.一般用来设置主键列。
null和not null设置是否可以为空
defaule用于设置默认值

6.创建表

create table student(
	id int(4) not null auto_increment COMMENT '学号',
	name VARCHAR(20) not null DEFAULT '匿名' COMMENT '姓名',
	gender VARCHAR(2) not null DEFAULT '女' COMMENT '性别',
	birthday datetime DEFAULT null COMMENT '出生日期',
	address VARCHAR(100) DEFAULT null COMMENT '家庭地址',
	age int(3)  DEFAULT null COMMENT '年龄',
	PRIMARY KEY(id)
)ENGINE=INNODB DEFAULT CHARSET =UTF8
--注意点:
--主表和字段名尽量使用``括起来
--主键声明一般放在最后一行
--标准语法:CREATE TABLE IF NOT EXISTS 表名(
	字段名	数据类型 [属性][索引][注释]...
)表的存储引擎 字符集设置

7.数据库存储引擎

INNODB:默认使用。安全性比较高,支持事务的机制。

MYISAM:过时的。节约空间,速度较快。

MYISAMINNODB
事务支持不支持支持
数据行锁定不支持支持
外键约束不支持支持
全文索引支持不支持
空间大小比较小大概是前者的2倍

8.修改表操作

修改表名:ALTER TABLE 旧表明 RENAME AS 新表名
添加字段:ALTER TABLE 表名 ADD 字段名 数据类型 [属性]
修改字段的数据类型:ALTER TABLE 表名 MODIFY 字段名 数据类型
修改字段名称:ALTER TABLE 表名 CHANGE 旧字段名 新字段名 数据类型 [属性]
删除字段:ALTER TABLE 表名 DROP 字段名
删除表:DROP TABLE [if EXISTS]  表名
--尽量创建和删除的时候加上判断

9.DML

添加:INSERT INTO 表名(字段名...) VALUES(...)
添加多条:INSERT INTO 表名(字段名...) VALUES(...),(...),(...)
修改:UPDATE 表名 SET 字段名=字段值 [WHERE条件]
删除:DELETE FROM 表名 [WHERE条件]
删除所有:DELETE FROM 表名(尽量不要这么写)
--不属于DML的删除
TRUNCATE:清空一张表。表的结构不会变。
TRUNCATE TABLE `student`
DELETE FROM 表名和 TRUNCATE 表名的区别:
1.DELETE可以局部删除(使用where子句进行定向删除)。而TRUNCATE只能删除整个表的数据
2.TRUNCATE会重置自增列,计数器归零。而DELETE不会。
3.DELETE属于DML。操作的数据可以回滚。TRUNCATE属于DDL,操作不会进行存储。不能回滚。

10.DQL

SELECT [ALL|DISTINCT] 
{*|TABLENAME.*|ALIAS.*|TABLENAME.FILED1,TABLENAME.FRILED2...}
FROM TABLENAME [AS TABLE_ALIAS]
[LEFT|RIGHT|INNER JOIN TABLENAME2] --联合查询
[WHERE ...]--判断条件
[GROUP BY...] --分组
[HAVING]--筛选
[ORDER BY]--排序
[LIMIT OFFSET,SIZE]--从offset的位置查询size个数据

11.总结练习

12.MD5加密

#密码是不能明文显示的  所有需要加密
#1.Java代码进行加密,把加密后的密文存储在数据库中
#2.数据库加密
INSERT INTO user(user_pwd) values('lxk0520')
#后期修改密码
UPDATE user SET user_pwd = MD5(user_pwd)
#插入数据的时候直接加密
INSERT INTO user(user_pwd) values(MD5('linli'))
SELECT count(*) FROM user WHERE user_id=2 AND user_pwd = MD5('lxk0520')

13.事务

事务就是数据库中一组最小的运行单位,其中不管包含了多少SQL都具备要么一起成功,要不一起失败的特点。

13.1 事务特性

ACID

名称描述
原子性(A)原子性就是指事务是一个不可以分割的工作单元,事务中的操作要不都发生,要不都不发生
一致性( C)事务前后数据的完整性必须保持一致
隔离性(I)事务的隔离性发生在多线程高并发的情况下。数据库会给每个用户开启一个事务,A用户的对数据库的操作不会被其他用户干扰。各个事务之间相互隔离。
持久性(D)事务一旦提交就成为了不可逆状态。就算此时服务器出现故障也不会影响到数据,因为此时数据已经存储在磁盘中。
13.2 事务并发的问题
问题名称描述
脏读一个事务读取到了另外一个事务未提交的数据
不可重复读在一个事务中读取表内的一行数据,多次读取的结果不同。
幻读(虚读)一个事务中读取了其他事务插入的数据源,导致前后读取不一致。
13.3 隔离级别

在数据库中为了保证并发情况下读取数据的正确性,数据库本身提出了事务隔离级别。

读未提交:一个事务可以读取到其他事务未提交的数据,在这种隔离级别下,所有的查询不会加锁,一致性最差。

​ 如果设置成此种隔离级别那么上述的三种问题都会出现。

读已提交:一个事务只能读取其他事务已经提交的数据。这次隔离级别会解决脏读的问题,但是不可重复读和幻读还是可能出现。

​ 注意:此种隔离级别是绝大部分数据都默认使用的隔离级别。ORACLE。但是Mysql不使用这种隔离级别。

可重复读:事务在执行过程中可以读取其他事务已经提交的数据,但是不能读取其他事务对数据的修改。这种隔离级别可以解决脏读,不可重复读的问题,但是还是会出现幻读的问题。

​ 注意:Mysql默认使用的就是此种隔离级别

串行化:并发时事务使用串行化执行,一个事务执行的时候,其他事务等待。此种隔离级别不会出现上述的三种问题。但是并发能力很差。

13.4 事务的操作

在后期的开发中事务交由后台Java代码解决。

默认情况下每一条sql都是一个单独的事务。

1.关闭自动提交事务

SET autocommit=0;

2.开启事务

START TRANSACTION

3.提交事务

COMMIT

4.回滚

ROLLBACK

5.设置回滚点

SAVEPOINT 回滚点名

ROLLBACK TO SAVEPOINT 回滚点名

14.索引

索引:使Mysql提高获取数据速度的数据结构。

索引的好处:

​ 提高查询的速度

​ 确保数据的唯一性

​ 联合查询的时候加速表与表之间的链接。

​ 使用分组,排序的时候加速效率

​ 全文检索加速

14.1 主键索引

PRIMARY KEY:唯一标识,不可重复。数据库中最常见的索引类型,不允许为空值。确保数据记录在数据库中的位置

14.2 普通索引

普通索引的作用一般就是用于条件查询,可以快速的定位到指定数据。根据项目的需求在查询比较频繁的字段上可以添加普通索引,但是并不是索引越多越好。如果一张表中存在了过多的索引还会造成查询效率的地下。所以索引不适合在频繁修改数据的字段上。

CREATE INDEX indexName ON tableName (columName)

14.3 唯一索引

UNIQUE KEY:此索引和普通索引相似,区别就是此索引具备唯一性,此索引允许为NULL

和主键索引的区别是:主键索引只能有一个,唯一索引可以有多个

14.4全文索引

可以快速的定位到指定数据。

但是只能在MyISAM存储引擎下使用。而且只能检索CHAR,VARCHAR,TEXT类型的数据。适合大数据量的数据集

14.5 索引命令
#查看索引
SHOW INDEX FROM user
#删除指定索引
DROP INDEX index_pwd ON user

15.存储过程

存储过程:使用多表sql语句完成一个业务需求的执行链。

存储过程:一条或者多条SQL语句的集合,结构和子查询,但是子查询属于一条sql,而存储过程是一组完成特性功能的SQL语句集合。经过编译之后存储在数据库中,在需要的时候直接调用,原理和脚本语言的函数一样。

优点:

​ 1.可以把一些复杂的sql进行封装,简化单条sql

​ 2.简单的变动只需要更改存储过程代码就可以

​ 3.存储过程在一定情况下效率比较高,因为预先编译

缺点:

​ 1.语句复杂

​ 2.一般用户没有创建存储过程的权限,只能调用存储过程

实际开发场景:

​ 在实际开发中业务逻辑不会封装到数据库中的,业务逻辑交给应用程序处理。

​ 数据库在开发体系中作用就是存储数据和查询数据源,其他所有的行为都需要避免,尽可能减少数据库资源的浪费

​ 由于存储过程维护麻烦,大量的业务逻辑的处理交给了存储过程,如果后期业务发生了改变维护特别麻烦

​ 电信公司,银行,金融这些行业会用到存储过程,但是在互联网行业基本没人使用

CREATE PROCEDURE addDate()
BEGIN
	SET @i=0;
	WHILE @i<10 do
		INSERT INTO user(user_pwd) values(MD5('linli'));
		SET @i=@i+1;
	END WHILE;
END;

CALL addDate();

16.触发器

触发器:Mysql中响应(增,修,删操作的时候自动的执行一条或者多条的Sql语句。

语法:

CREATE TRIGGER 触发器的名字 触发时间 触发事件 ON 表名 FOR EACH ROW 触发处理的SQL语句
触发时间(time):BEFORE,AFTER
触发事件(even):INSERT,UODATE,DELETE
触发处理的SQL语句:一个或多个sql语句

触发器在现在同样被后端语言取代,基本不用

17.视图

视图:数据库中虚拟的表。和普通表不同的是,视图的数据都来自于普通表。只是用来查询使用

CREATE VIEW v_grade_student AS SELECT s.*,g.grade_name FROM student s LEFT JOIN grade g ON s.grade_id=g.grade_id;


SELECT * FROM v_grade_student

作用:复用sql。 保护数据。

使用特点:视图不能有索引。并且视图不能有关联的触发器和默认值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

misz†

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值