MySQL学习笔记

MySQL

数据库(DB,DataBase)

概念:数据仓库,软件,安装在操作系统(window,Linux,mac、…)之上。SQL,可以存储大量的数据。500万。

作用:存储数据,管理数据。

初识MySQL

数据库分类

关系数据库:(SQL)

  • MySQL,Oracle,SQL Server,DB2,SQLlite
  • 通过表和表之间,行和列之间的关系进行数据的存储,信息表一类。

非关系数据库:(NoSQL) Not Only SQL

  • Redis,MongDB
  • 非关系数据库,对象存储,通过对象自身的属性来决定。
DBMS(数据库管理系统)
  • 数据库的管理软件,科学有效的管理我们的数据。维护和获取数据
  • MySQL,数据库管理系统

网上搜索下载安装,教程

安装SQLyog,或者Navicat。(自己选择)

连接数据库

命令行连接!

mysql -u root -p 123456 -- -u后面是账号名,-p后是密码

update mysq1.user set authentication_string=password('123456') where user='root' and Host ='loca1host'; --修改用户密码

flush privileges;  --刷新权限

-------------------------------------------------
--所有语句要以英文;结尾
show databases; --查看所有数据库

use zy -- 切换数据库 use 数据库名

show tables; -- 查看数据库中所有表
describe student; -- 显示该表的所有属性定义信息

create database zy; -- 创建一个数据库

exit; --退出数据库

-- 单行注释(sql的单行注释)
/*(sql的多行注释)
fdfew
fs
*/

数据库 XXX 语言

DDL 数据库定义语言

DML 数据库操作语言

DQL 数据库查询语言

DCL 数据库控制语言

操作数据库

操作数据库>操作数据库中的表>操作数据库表中的数据

MySQL关键字不区分大小写

  1. 创建数据库

    create database [if not exists] zy
    
  2. 删除数据库

    drop database [if exists] zy
    
  3. 使用数据库

use `zy`  --tab键上面的符号,如果表名或者字段是特殊字符,需要带 ` `
  1. 查看数据库
show databases  --查看所有数据库
数据库的列类型
  • 数值
    • tinyint 十分小的数据 1个字节
    • smallint 较小的数据 2个字节
    • mediumint 中等大小的数据 3个字节
    • int 标准的整数 4个字节
    • bigint 较大的数据 8个字节
    • float 浮点数 4个字节
    • double 浮点数 8个字节(精度问题!)
    • decimal 字符串形式的浮点数 金融计算的时候,一般是使用decimal
  • 字符串
    • char 字符串固定大小的 0~225
    • varchar 可变字符串 0~65535 常用 String
    • tinytext 微型文本 2^8-1
    • text 文本串 2^16-1 保存大文本
  • 时间日期 java.util.Date
    • date YYYY-MM-DD,日期
    • time HH:MM:SS ,时间
    • datetime YYYY-MM-DD HH:MM:SS
    • timestamp 时间戳,1970.1.1到现在的毫秒数!
    • year 年份表示
  • null
    • 没有值,未知
    • 注意,不要用null进行运算,结果为null
数据库的字段属性(重点)

Unsigned:

  • 无符号的整数
  • 声明了该列不能声明为负数

zerofill:

  • 0填充
  • 不足的位数,用0来填充,例子:int (3),5 — 005

自增:

  • 通常理解为自增,自动在上一条记录的基础上+1(默认)
  • 通常用来设计唯一的主键~ index,必须是整数类型
  • 可以自定义设计主键自增的起始值和步长

非空 NULL ,NOT NULL

  • 假设设置为not null,如果不给它赋值,就会报错
  • NULL,如果不填写值,默认就是null

默认:

  • 设置默认的值!
  • 例子:sex,默认为男,在你没有输入的情况下,创建的数据对象,都默认为男

扩展:

id --主键

`version`  --乐观锁

is_delete  --伪删除

gmt_create  --创建时间

gmt_update --修改时间

--每个表,都必须存在以下五个字段!未来做项目使用,代表一个记录存在的意义
数据库命令语句
-- AUTO_INCREMENT 自增
-- 字符串使用单引号括起来!
-- 所有的语句后面加,(英文逗号),最后一个不用加
-- PRIMARY KEY 主键,一个表只有一个唯一的主键
CREATE TABLE IF NOT EXISTS `Test`(
		`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

格式:

CREATE TABLE [IF NOT EXISTS] `表名`(
	`字段名` 列类型 [属性] [索引] [注释],
    `字段名` 列类型 [属性] [索引] [注释],
    `字段名` 列类型 [属性] [索引] [注释],
    ...........
    `字段名` 列类型 [属性] [索引] [注释]
)[表类型][字符集设置][注释]

常用命令

SHOW CREATE DATABASE `yql` -- 查看创建数据库的语句

-- CREATE DATABASE `yql` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */

SHOW CREATE TABLE `student` -- 查看创建student数据库表的语句
-- CREATE TABLE `student` (
--   `Id` varchar(255) COLLATE utf8_bin NOT NULL,
--   `Name` varchar(255) COLLATE utf8_bin DEFAULT NULL,
--   `Class` varchar(255) COLLATE utf8_bin DEFAULT NULL,
--   `chineseScore` varchar(255) COLLATE utf8_bin DEFAULT NULL,
--   `mathScore` varchar(255) COLLATE utf8_bin DEFAULT NULL,
--   PRIMARY KEY (`Id`)
-- ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
DESC student -- 显示表的结构
数据表的类型
数据库引擎
  • INNODB 默认使用
  • MYISAM 早些年使用
MYISAMINNODB
事务支持不支持支持
数据行锁定不支持支持
外键约束不支持支持
全文索引支持不支持
表空间的大小较小较大,约为2倍

常规使用操作:

  • MYISAM 节约空间,速度较快
  • INNODB 安全性高,事务的处理,多表多用户操作
在物理空间存在的位置

所有数据库文件都存在data目录下,一个文件夹就对应一个数据库

本质还是文件的存储!

MySQL引擎在物理文件上 的区别

  • INNODB在数据库表中只有一个*.frm文件,已经上级目录下的ibdata1文件
  • MYISAM 对应文件
    • *.frm 表结构的定义文件
    • *.MYD 数据文件(data)
    • *.MYI 索引文件(index)
设置数据库的字符集编码
charset=utf8

不设置的话,会是mysql默认的字符集编码~(不支持中文!)

MySQL的默认编码是Latin1,不支持中文

在my.ini中配置默认的编码(设置后可以不用再写上面语句,但不建议使用)

character-set-server=utf8
修改删除表
  1. 修改表
-- 修改表名
ALTER TABLE test RENAME AS test01

-- 增加表的字段 添加学校
ALTER TABLE test01 ADD school VARCHAR(20)

-- 修改表的字段,重命名和修改约束
-- ALTER TABLE 表名 MODIFY 字段名 列属性[]
ALTER TABLE test01 MODIFY school VARCHAR(40)

-- ALTER TABLE 表名 CHANGE 修改前字段名 修改成的字段名 列属性[]
ALTER TABLE test01 CHANGE school schId INT(10)

-- 删除表的字段 ALTER TABLE 表名 DROP 字段名
ALTER TABLE test01 DROP schId
  1. 删除表
-- 删除表(IF EXISTS,判断如果存在就删除,不存在发出警告)
DROP TABLE IF EXISTS test01

所有的创建和删除操作尽量加上判断,以免报错

注意点:

  1. `` 字段名,使用这个包裹
  2. 注释 – /**/
  3. sql语句不区分大小写
  4. 所有符号用英文

MySQL数据管理

外键(了解即可)
  • 方法一:在创建表的时候,添加约束(麻烦,比较复杂)
CREATE TABLE IF NOT EXISTS `grade`(		
	`gradeId` INT(5) NOT NULL AUTO_INCREMENT COMMENT '年纪编号',						  
	`mathSocre` INT(3) NOT NULL DEFAULT 0 COMMENT '数学成绩',		
	PRIMARY KEY(`gradeId`)
	)ENGINE=INNODB DEFAULT CHARSET=utf8
	
	-- Test表 的gradeId字段 去引用grade表的gradeId
	-- 定义外键
	-- 给外键添加约束,执行引用, REFERENCES references引用
	CREATE TABLE IF NOT EXISTS `Test`(		
	`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 '邮箱',		
	`gradeId` INT(5) NOT NULL COMMENT '学生年纪',		
	PRIMARY KEY(`id`),		
	KEY `FK_gradeId`(`gradeId`),		
	CONSTRAINT `FK_gradeId` FOREIGN KEY (`gradeId`) REFERENCES `grade`(`gradeId`)
	)ENGINE=INNODB DEFAULT CHARSET=utf8

删除有外键关系的表达时候,必须要先删除引用别人的表(从表),再删除被引用的表(主表),这里grade就是主表,Test是从表

  • 方法二:创建表成功后,添加外键约束
CREATE TABLE IF NOT EXISTS `grade`(		
	`gradeId` INT(5) NOT NULL AUTO_INCREMENT COMMENT '年纪编号',		
	`mathSocre` INT(3) NOT NULL DEFAULT 0 COMMENT '数学成绩',		
	PRIMARY KEY(`gradeId`)
	)ENGINE=INNODB DEFAULT CHARSET=utf8
	
	-- Test表 的gradeId字段 去引用grade表的gradeId
	-- 定义外键
	-- 给外键添加约束,执行引用, REFERENCES references引用
	CREATE TABLE IF NOT EXISTS `Test`(		
	`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 '邮箱',		
	`gradeId` INT(5) NOT NULL COMMENT '学生年纪',		
	PRIMARY KEY(`id`)
	)ENGINE=INNODB DEFAULT CHARSET=utf8
	-- 创建表时没有外键关系ALTER TABLE `Test`ADD CONSTRAINT `FK_gradeId` FOREIGN KEY(`gradeId`) REFERENCES `grade`(`gradeId`);
	-- ALTER TABLE 表名 ADD CONSTRAINT 约束名 FOREIGN KEY(作为外键的列) REFERENCES 被引用的表名(对应外键的字段);

以上的操作都是物理外键,数据库级别的外键,我们不建议使用!(避免数据库过多造成困扰,了解就行)

最佳实践

  • 数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)
  • 我们想使用多张表的数据,想使用外键(程序去实现)
DML语言(操作语言 记住)
插入语句(insert)
-- 插入语句
-- INSERT INTO 表名(`字段名`,`字段名`,....) VALUES ('值','值',.....)
INSERT INTO `grade`(`gradeId`,`mathSocre`) VALUES (2,77)

-- 由于主键自增我们可以省略(如果不写表的字段会一一匹配)
INSERT INTO `grade` VALUES (8,99)

-- 在写插入语句时一定要注意数据和字段的一一对应
-- 插入多个字段
-- INSERT INTO 表名(`字段名`,`字段名`,....) VALUES ('值','值',.....),('值','值',.....),('值','值',.....)....
-- 在传入值的括号后用英文逗号隔开,再写,可以一直插入
INSERT INTO `grade` VALUES (3,33),(4,44),(5,55),(6,66)

语法:INSERT INTO 表名(字段名,字段名,…) VALUES (‘值’,‘值’,…)

注意事项:

  1. 字段和字段之间使用要用英文逗号隔开。
  2. 字段是可以省略的,但后面的数据要和字段的顺序一一对应,不能缺少。
  3. 可以同时插入多条数据,values后面的值,需要使用英文逗号隔开即可。
修改语句(update)
-- 修改名字
UPDATE `test` SET `name`='小红' WHERE id=1

-- 不指定条件,会直接修改所有
UPDATE `test` SET `name`='小二'

-- 修改多个属性用英文逗号隔开,自己写对应的
UPDATE `test` SET `name`='左右',sex='男' WHERE id = 1

-- 语法
-- UPDATE 表名 SET column_name= value,column_name= value,..... WHERE 条件

条件:where子句,运算符 id等于某个值,大于某个值,在某个区间内修改…

操作符返回 布尔值

操作符含义范围结果
=等于5=9false
<> 或 !=不等于5<>9true
>大于5>3true
<小于5<3false
>=大于等于5>=5true
<=小于等于5<=5true
between…and…某个范围内[2,5]
AND和&&一样
OR或和||一样
-- 通过多个条件定位数据
UPDATE `test` SET `name`='大小' WHERE `name`='小二' AND sex='女'

注意:

  • column_name 是数据库的列,尽量带上``
  • 条件,筛选的条件,如果没有指定,则会修改所有的列
  • value,是一个具体的值,也可以是一个变量
  • 记住英文逗号隔开
删除语句(delete)
-- 删除所有数据,尽量不要这样操作
DELETE FROM `test`

-- 按条件删除对应数据
DELETE FROM `test` WHERE id = 1
TRUNCATE 命令

作用:完全清空一个数据库表,表的结构和索引约束不会变

-- 清空表TRUNCATE `test`

delete 和 truncate 的区别

  • 相同点:都能删除数据,都不会删除表结构
  • 不同
    • TRUNCATE 重新设置 自增列 计数器会归零
    • TRUNCATE 不会影响事务
查询语句(select)

SELECT的完整语法

SELECT [ALL | DISTINCT]
{* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
FROM table_name [as table_alias]			
		[1eft | right / inner join table_name2] --联合查询			
		[WHERE ...]--指定结果需满足的条件			
		[GROUP BY ...]--指定结果按照哪几个字段来分组			
		[HAVING] --过滤分组的记录必须满足的次要条件			
		[ORDER BY ...]--指定查询记录按一个或多个条件排序			
		[LIMIT {[offset,]row_count / row_countOFFSET offset}];--指定查询的记录从哪条至哪条
		--指定查询的记录从哪条至哪条/*注意:[]括号代表可选,{}括号代表必选,同时这些顺序不能错,要按一定顺序写*/
最基础的使用
-- 查询所有学生
-- 语法 SELECT 字段 FROM 表名
SELECT * FROM `student`

-- 查询指定字段
SELECT `studentno`,`studentname` FROM `student` 

-- 别名,给结果起一个名字 AS ,也可以给表起别名
SELECT `studentno` AS 学号,`studentname` AS 学生姓名 FROM `student` AS s

-- 函数 concat(a,b) 拼接
SELECT CONCAT('姓名:',`studentname`) AS 新名字 FROM `student`

语法:SELECT 字段… FROM 表名

注意有时候列名并不是一样的,可以取别名

去重(distinct)
-- 查询一下有哪些同学参加了考试有成绩
SELECT * FROM result -- 查询全部考试成绩
SELECT `studentno` FROM result -- 查询有哪些同学参加了考试,但是不是一门学科,所以有大量重复学号
SELECT DISTINCT `studentno` FROM result -- 去重,将重复的学号只保留一个下来
  1. 数据库的列(表达式)
SELECT VERSION() -- 查询系统版本(函数)
SELECT 100*3-1 AS 计算结果 -- 用来计算 (表达式)
SELECT @@auto_increment_increment -- 查询自增的步长(变量)
-- 学员考试成绩+1分查看
SELECT `studentno`,`studentResult`+1 AS '提分后' FROM result

数据库中的表达式:文本值,列,NULL,函数,计算表达式,系统变量…

select 表达式 from 表名

  • where条件子句
    • 逻辑运算符
      • and && 与,两种都可以使用
      • or || 或,两种都可以使用
      • not ! 非,两种都可以使用
模糊查询

比较运算符

运算符语法描述
IS NULLa is null如果操作符为NULL,结果为真
IS NOT NULLa is not null如果操作符不为null,结果为真
BETWEENa between b and c若a在b和c之间,则结果为真
LIKEa like bSQL匹配,如果a匹配b,则结果为真
INa in (a1,a2,a3…)假设a在a1,或者a2…其中的某一个值中,结果为真
-- 模糊查询
-- =======like======-- 配合like使用的的两个符号,%(代表0到任意个字符),_(只代表一个字符)
-- 查询姓张的同学
SELECT * FROM `student`
WHERE studentname LIKE '张%'

-- 只查找姓张,名字只有两个字的同学
SELECT * FROM `student`
WHERE studentname LIKE '张_'

-- 只查找姓张,名字三个字的同学
SELECT * FROM `student`
WHERE studentname LIKE '张__'

-- 查询名字中带有大的同学 %大%
SELECT * FROM `student`
WHERE studentname LIKE '%大%'

-- =========in (具体的一个值或者多个值)
-- 查询 1001 1002 1003
SELECT * FROM `student`
WHERE studentno IN (1001,1002,1003)

-- 查询地址在江西南昌和北京朝阳的
SELECT * FROM `student`
WHERE address IN ('江西南昌','北京朝阳')

-- ========null  not null========
-- 查询地址为空的同学
SELECT * FROM `student`
WHERE address='' OR address is NULL
-- 查询出生日期不为空的同学
SELECT * FROM `student`
WHERE borndate IS NOT NULL
联表查询

七种join理论

img

========联表查询============
/*思路
1.分析需求,分析查询的字段来自哪些表,(连接查询)
2.确认使用哪种连接查询- 七种确认交叉点判断就是交叉点相同
*/
-- join (连接的表) on (判断条件)
-- where 等值查询
SELECT studentno,studentname,s.gradeid,gradename
FROM student AS s
INNER JOIN grade AS g
WHERE s.gradeid=g.gradeid

SELECT studentno,studentname,s.gradeid,gradename
FROM student AS s
INNER JOIN grade AS g 
ON s.gradeid=g.gradeid

-- RIGHT JOIN
SELECT studentno,studentname,s.gradeid,gradename
FROM student AS sRIGHT JOIN grade AS g 
ON s.gradeid=g.gradeid

-- LEFT JOIN
SELECT studentno,studentname,s.gradeid,gradename
FROM student AS sLEFT JOIN grade AS g 
ON s.gradeid=g.gradeid

-- 查询年纪编号错误的学生
SELECT studentno,studentname,s.gradeid,gradename
FROM student AS sLEFT JOIN grade AS g 
ON s.gradeid=g.gradeid
WHERE gradename IS NULL

-- 同时查询三个表
SELECT studentno,studentname,s.gradeid,gradename,subjectname
FROM `student` AS sLEFT JOIN `grade` AS g 
ON s.gradeid=g.gradeid
INNER JOIN `subject` AS sub 
ON s.gradeid=sub.gradeid
-- 左右查询就是会把在语句左右的表中所有可能查出来
-- 多表查询,要一张张表来判断条件增加查询,避免出错
自连接(了解)

自连接就是自己内部的列相同查询。

分页和排序
-- ======排序========
-- asc 升序  desc 降序
SELECT * 
FROM result
ORDER BY studentresult ASC

SELECT * 
FROM result
ORDER BY studentresult DESC

-- =======分页===========
SELECT * 
FROM result
ORDER BY studentresult ASC
LIMIT 0,3-- LIMIT 起始的页,页的大小
子查询和嵌套查询
-- 子查询三个表,查询学习了高等数学-3的学生
SELECT studentno,studentname
FROM `student`
WHERE gradeid = (
SELECT gradeid 
FROM `subject` 
WHERE subjectname = '高等数学-3' )
分组以及过滤
-- 查询不同课程的平均分,最高分,最低分,平均分及格的课
-- 核心:(根据不同的课程分组)
SELECT `subjectname` AS 课程名,AVG(studentresult) AS 平均分,MAX(studentresult) AS 最高分,min(studentresult) AS 最低分
FROM result AS r
INNER JOIN `subject` AS sub
ON r.`subjectno` = sub.subjectno
GROUP BY r.subjectno
HAVING 平均分>=60
MySQL函数

官网链接:MySQL :: MySQL 8.0 Reference Manual

-- 时间和日期函数(记住)
SELECT CURRENT_DATE() -- 获取年月日
SELECT CURDATE() -- 获取年月日
SELECT NOW() -- 会获取时分秒
SELECT SYSDATE() -- 系统时间

-- 系统
SELECT SYSTEM_USER() -- 获取系统用户
SELECT USER() -- 获取系统用户
SELECT VERSION() -- 获取系统数据库版本

聚合函数(用的多)

函数名称描述
COUNT()计数
SUM()求和
AVG()求平均值
MAX()最大值
MIN()最小值
-- ========聚合函数==========
-- 统计
SELECT COUNT(`studentname`) FROM student --count(字段),会忽略所有的null值
SELECT COUNT(*) FROM student -- count(*),不会忽略null值,本质是计算行数
SELECT COUNT(1) FROM student -- count(*),不会忽略null值,本质是计算行数

SELECT SUM(`studentresult`) AS 总和 FROM result
SELECT AVG(`studentresult`) AS 平均值 FROM result
SELECT MAX(`studentresult`) AS 最大值 FROM result
SELECT MIN(`studentresult`) AS 最小值 FROM result
扩展(数据库级别的MD5加密)

在插入和修改时密码放在MD5(密码)这样,然后查询也是如此。都是对应的。

事务

要不都成功,要不都失败

参考博客:(3条消息) 事务ACID理解_dengjili的专栏-CSDN博客_事务acid

事务(ACID):

  • 原子性(Atomicity)
    原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
  • 一致性(Consistency)
    事务前后数据的完整性必须保持一致。
  • 隔离性(Isolation)
    事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
  • 持久性(Durability)
    持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

脏读:

指一个事务读取了另外一个事务未提交的数据。

不可重复读

在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)

虚读(幻读)

是指在一个事务内读取到了别的事务插入的数据,导致前后读取数量总量不一致。

事务有关的命令:

-- =============事务=====================
-- MySQL 是默认开启事务自动提交的
SET autocommit = 0 -- 关闭事务自动提交(要记得重新开启)
SET autocommit = 1 -- 开启事务自动提交,默认

-- 手动处理事务
START TRANSACTION -- 标记一个事务的开始,从这个之后的sql都在同一个事务内

INSERT xx
INSERT xx
-- 两个sql命令错了一个,两个都不能成功

-- 提交,持久化(成功!)
COMMIT

-- 回滚:回到原来的样子(失败!)
ROLLBACK

-- 了解
SAVEPOINT 保存点名 -- 设置一个保存点
ROLLBACK to SAVEPOINT 保存点名字 -- 回滚到保存点
RELEASE SAVEPOINT 保存点名字 -- 撤销保存点

转账模拟事务:

-- 转账
-- 创建数据库
CREATE DATABASE shop CHARACTER SET utf8 COLLATE 
utf8_general_ci
USE shop
CREATE TABLE `account`(		
		`id` INT(3) not NULL auto_increment,		
		`name` VARCHAR(30) not null,		
		`money` DECIMAL(9,2) NOT NULL,		
		PRIMARY KEY (`id`)
		)ENGINE=INNODB DEFAULT charset=utf8
		
		-- 插入数据
		INSERT INTO `account` VALUES (1,'a',1000),(2,'b',2000)
		
		-- 模拟转账事务
		SET autocommit = 0 -- 关闭事务自动提交
		START TRANSACTION -- 开启一个事务

		-- 转账
		UPDATE account set money=money-500 WHERE `name`='a' -- a减500
		UPDATE account set money=money+500 WHERE `name`='b' -- b加500
		
		COMMIT -- 提交事务
		rollback -- 回滚

		SET autocommit = 1 -- 重新开启事务自动提交

索引

索引的分类
  • 主键索引(PRIMARY KEY)
    • 唯一的标识,主键不可重复,只能有一个列为主键
  • 唯一索引(UNIQUE KEY)
    • 避免重复的列出现,唯一索引可以重复出现,多个列都可以有唯一索引
  • 常规索引 (KEY/INDEX)
    • 默认的,index,key关键字来设置
  • 全文索引 (FULLTEXT)
    • 在特定的数据库引擎下才有,MyISAM
    • 快速定位数据
-- 显示所有索引
SHOW INDEX FROM student

-- 增加一个全文索引 索引名(列名)
ALTER TABLE student ADD FULLTEXT INDEX `studentName`(`studentname`)

-- EXPILAIN 分析sql执行的状况
EXPILAIN SELECT * FROM student 

-- 创建索引名 id_表名_字段名
-- CREATE INDEX 索引名 ON 表名(字段名)

索引在小数据量的时候,用户不大,但是在大数据的时候,区别十分明显

索引原则
  • 索引不是越多越好
  • 不要对进程变动数据加索引
  • 小数据量的表不需要加索引
  • 索引一般加在常用来查询的的字段上!

索引的数据类型:

  • Hash类型
  • Btree:InnoDB的默认数据结构~

查阅文档博客

数据库管理和备份

数据库用户管理

sql命令:

-- 创建用户 CREATE USER 用户名 IDENTIFIED BY '密码'

-- 修改密码(修改当前用户)
-- SET PASSWORD = PASSWORD('新密码')

-- 修改密码(修改指定用户密码)
-- SET PASSWORD FOR 用户名 = PASSWORD('新密码')

-- 重命名 
-- rename user 原来的名字 to 新名字

-- 用户授权 all privileges(所有权限) on 库.表 to 用户名
-- all privileges 除了给别人授权,其他都能够干
-- grant all privileges on *.* to 用户名

-- 查询权限
-- show grants for 用户名-- 查看指定用户的权限
-- show grants for root@localhost

-- root用户权限:grant all privileges on *.* to 'root'@'localhost' with grant option

-- 撤销权限 revoke 哪些权限,在哪个库撤销,给谁撤销
-- revoke all privileges on *.* from 用名

-- 删除用户
-- drop user 用户名
MySQL备份

备份原因:

  • 保证重要的数据不丢失
  • 数据转移

MySQL数据库备份的方式:

  • 直接拷贝物理文件
  • 在可视化工具中手动导出
  • 使用命令行导出 mysqldump 命令行使用
# mysqldump -h 主机 -u 用户名 -p 密码 数据库 表名 > 物理磁盘位置/文件名
mysqldump -hlocalhost -uroot -p123456 school student >D:/a.sql

# 可以多个表,在表名出写上多个,不写就是导出整个数据库

# 导入
# 登录数据库的情况下,切换到指定的数据库
# source 备份文件
source d:/a.sql

# 未登录
mysql -u用户名 -p密码 库名< 备份文件

规范数据库设计

设计数据库
  • 分析需求:分析业务和需要处理的数据要求
  • 概要设计:设计关系图E-R 图
三大范式

第一范式(1NF)

原子性:保证每一列不可再分

第二范式(2NF)

前提:满足第一范式

每张表只描述一件事情

第三范式(3NF)

前提:满足第一范式和第二范式

第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

规范性和性能的问题

  • 考虑商业化的需求和目标,(成本,用户体验!) 数据库的性能更加重要
  • 在规范性能的问题的时候,需要适当的考虑一下 规范性!
  • 故意给某些表增加一些冗余的字段。(从多表查询中变为单表查询)

JDBC(重点)

数据库连接池

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值