0
点赞
收藏
分享

微信扫一扫

MySQL操作基础:一篇文章就够了|最强笔记


MySQL操作基础:一篇文章就够了

一、数据的基本知识

(1)数据的类型


数值


int 标准整数 4个字节

bigint 较大的数据 8个字节

float 浮点数 4个字节

double 浮点数 8个字节

decimal 字符串形式的浮点数 金融计算


字符串


char 字符串 0~255

varchar 可变字符串 0~65535

tinytext 小文本 2^8 - 1

text 文本串 2^16-1


时间和日期


data YYYY-MM-DD,日期格式

time HH:MM:SS,时间格式

datetime YYYY-MM-DD HH:MM:SS

timestamp 时间戳,1970.1.1到现在的毫秒数

year 年份表示


null


空值未知,使用null进行运算还是null

(2)数据库的字段属性

​Unsigned​:无符号整数,不能为负数

​zerofill​:o填充,不足用0填充

​自增​:自动在上一条记录基础+1,一般用来设置唯一的主键,必须为整数类型,可以自定义自增的起始值和步长。

​非空​:假设设置为not null,如果不赋值则会报错

​默认​:设置默认的值,如果不指定该列的值,产生默认的值

​gmt_create​:创建时间

​gmt_update​:修改时间

二、命令行操作

mysql -uroot -p-连接数据库

updata mysql.user set authentication_string=passord('123456') where user='root' and Host = 'localhost';--修改用户密码

flush privileges; --刷新权限
-----------------------------

--所有的语句都用;结尾
show databases; -- 查看所有数据库
show tables; -- 查看数据库中所有的表
describe student;--查看数据库中所有表的信息
--ctrl + c强行终止

creat database westos;创建一个数据库

exit;-- 退出连接
-- 注释
-- 关键字不区分大小写


ctrl + S 保存SQL代码


三、数据库引擎与字符集编码

1、数据库引擎


INNOB 默认使用

MYISAM 以前使用


INNOB

MYISAM

事务支持

支持

不支持

数据行锁定

支持

不支持

外键约束

支持

不支持

全文索引

不支持

支持

表空间大小

较大

较小

常规使用操作:

MYISAM 节约空间,速度较快

INNODB 安全性高,多用户操作

2、字符集编码


CHARSET = utf8


不设置则为默认的MySQL字符集编码Latin1,将不支持中文。

四、数据库操作

数据库>数据库中的表>表中的数据

(1)数据库

​1、创建数据库​

CREATE DATABASE [IF NOT EXISTS] dida;

​2、删除数据库​

DROP DATABASE [IF EXISTS] dida;

​3、使用数据库​

-- 如果字段为特殊符号需要反引号``
USE `school`;

​4、查看数据库​

SHOW DATABASES;-- 查看所有数据库

(2)表

​1、创建表格式​

CREATE TABLE IF NOT EXISTS `表名`( 
`列名` 列类型(长度) [属性] [索引] [注释],
`列名` 列类型(长度) [属性] [索引] [注释],
······
`列名` 列类型(长度) [属性] [索引] [注释],
PRIMARY KEY(`主键`)
)[表类型] [字符集设置] [注释]

​案例​(建立student表格)

CREATE TABLE IF NOT EXISTS `student`( 
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR(30) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

​2、查看表​

SHOW CREATE TABLE `数据库名`; -- 查看创建数据库
SHOW CREATE TABLE `表名`; -- 查看创建数据表
DESC `表名`; -- 显示表的结构

​3、修改表​

ALTER TABLE NAME DoSomeThing NAME [New Name]/[QUALITY()]

-- 修改表名
ALTER TABLE `student` RENAME AS `student`;
-- 增加字段
ALTER TABLE `student` ADD age INT(10);
-- 修改约束
ALTER TABLE student MODIFY age VARCHAR(11);
-- 修改列名和约束
ALTER TABLE student CHANGE age age1 INT(11);
-- 删除表的列
ALTER TABLE student DROP age1;
-----------------
--``可以明确属性为字段名
-- sql书写大小写不敏感,建议小写
-- 所有符号英文

​4、删除表​

-- 删除表
DROP TABLE [IF EXISTS] 表名

(3)数据管理

1、外键

删除有外键关系的表,先删除引用外键的表,再删除被引用的表


阿里Java规范:不得使用外键与级联,一切外键概念必须再应用底层解决


–为了增强数据保存的独立性,减小操作约束


外键建立


-- ALTER TABLE 表名 ADD CONSTRAINT 约束名 FOREIGN KEY(作为外键的列名) REFENCES 被引用的表名(作为外键的列名)
ALTER TABLE `student`ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`);


2、数据操作语言

​A.添加​:INSERT


语法: INSERT INTO 表名([列名1,列名2…])VALUES(‘值1’),(‘值2’)…


列名省略,则值必须一一对应。可以同时插入多条数据,VELUES后面的值需要使用(),()隔开。

例如:

INSERT INTO `grade`(`gradename`) VALUES ('大四')-- 一次插入一个数据
INSERT INTO `student`(`name`) VALUES ('pp'),('zz') -- 一次插入同列多个
INSERT INTO `student`(`name`,`sex`) VALUES ('ppl','男') -- 一次插入同行多条
INSERT INTO `student` VALUES (7,'pp','123456','男','2001-06-06','153@qq.com') -- 一次插入整行数据

​B.修改​:UPDATE


语法: UPDATE ​​表名​​​ SET ​​属性名(列名)​​​ = ’修改名’ WHERE ​​条件语句​​;


注意分号隔开语句,若无WHERE指定,则会改变该列所有的值

例如:

UPDATE `student` SET `name` = '屁股' WHERE id = 1;
-- 不指定情况会改动所有表(没有where后面的)
UPDATE `student` SET `name` = '屁股',`email`='15399@qq.com' WHERE id != 1;
-- 修改多个属性,用英文逗号隔开
UPDATE `student` SET `name` = '屁股' WHERE id = 7 AND sex = '男';
-- WHERE是定位功能,其后的操作符(运算+逻辑)指定可元组

​C.删除​:DELETE


语法:

DELETE FROM ​​表名​​​ WHERE ​​条件语句​​;

TRUNCATE ​​表名​​;


区别:DELETE不会改变原自增序列,TRUNCATE自增会归零

例如

DELETE FROM `student` WHERE id = 8;
-- 如果不加WHERE,会删除所有元组

-- --------TRUNCATE------- --清空所有元组专用语句
TRUNCATE `student;`

​D.查询​:SELECT​ ​​重点​


语法:

SELECT [ ALL | DISTINCT]

属性名 … …

FROM 表名

JOIN 表名

ON 属性名= 属性名

WHERE 条件

GROUP BY 属性名

HAVING 条件

ORDER BY 属性名

LIMIT 当前位置,数据条数


例如

·简单查询·
-- 查询所有元组
SELECT * FROM student;
-- 查询指定属性的值
SELECT `name`,`email` FROM student;
-- 查询指定属性的值并更换属性名(原表属性名不清楚时)
SELECT `name` AS ·学号·,`email` AS `邮箱` FROM student;
-- 函数 CONCAT(a,b) 在b列插入前缀a,并修改属性名为c
SELECT CONCAT('姓名:',`name`) AS c FROM student;
--操作后查询
SELECT `id`+1 AS 变序 FROM student;

·去重查询· DISTINCT
-- 去重(去除SELECT查询结果中重复的数据)
SELECT DISTINCT `email` FROM student;

·无关查询·
SELECT VERSION() -- 查询系统版本
SELECT 100*3-1 AS 结果 --查询计算结果

·逻辑条件查询·
-- 查询指定属性条件的值
SELECT `name`,`email` FROM student WHERE `name` = '屁股' AND sex = '女';
SELECT `name`,`email` FROM student WHERE id BETWEEN 4 AND 5;

·模糊查询·
-- 查询名字带磊的同学
SELECT `name` ,`email` FROM `student` WHERE `name` LIKE '%磊%';
-- 查询名字磊在后面的的同学
SELECT `name` ,`email` FROM `student` WHERE `name` LIKE '%磊';
-- 查询名字p某某(后面两个字)的同学
SELECT `name` ,`email` FROM `student` WHERE `name` LIKE 'p__';
-- id为5,8,3的
SELECT `name` ,`email` FROM `student` WHERE `id` IN (5,3,8,6,7);
-- 查询生日不为空的同学
SELECT `name` ,`email` FROM `student` WHERE birthday IS NOT NULL;

·联表查询·SELECT FROM A xxxxx JOIN B on 属性中相等值
目的:提取多表的属性到一张表中
-- LEFT JOIN即使右表没有匹配,也会从左表中返回所有的值,没有该属性返回null
-- RIGHT JION即使左表没有匹配,也会从右表返回所有的值,没有该属性返回null
-- INNER JION返回两个表中相匹配存在的值
-- 两联查询
SELECT s.`id`,`name` ,`sex`,ifexam
FROM student AS s
RIGHT JOIN grade AS g
ON s.id = g.id
WHERE ifexam = '否' -- 可以加wehere条件语句去筛选需要的数据
-- 多联查询,一步一步地查询
SELECT s.`id`,`name` ,`sex`,ifexam,badthing
FROM student AS s
RIGHT JOIN grade AS g
ON s.id = g.id
INNER JOIN badstudent b
ON b.studentnumber = g.studentnumber
WHERE badthing = '脚踏两只船'

·父子关系查询·自连接--将一张分为两张
SELECT a.name AS f,b.name AS s
FROM category as c,category as b
WHERE a.cid = b.pid

·子查询· -- 如果where后的运算符为=子查询语句结果只能存在一个值
-- 查询student中的id,name,sex且在grade中id=1的值
SELECT s.`id`,`name` ,`sex`
FROM student s
WHERE id = (
SELECT id FROM grade WHERE id = 1 )
-- 查询student中的id,name,sex且在grade中id对应studentnumber大于100的值
SELECT s.`id`,`name` ,`sex`
FROM student s
WHERE id IN (
SELECT id FROM grade WHERE studentnumber > 100 )

·分组查询·
-- SELECT 分组属性名,分组计算函数 GROUP BY 分组属性名
SELECT ifexam,MAX(s.cord),MIN(s.cord),AVG(s.cord)
FROM student s
INNER JOIN grade g
ON s.cord = g.cord
GROUP BY g.ifexam
WHERE条件子句

运算符

含义

=

等于

<>或!=

不等于

>

大于

<

小于

>=

大于等于

<=

小于等于

BETWEEN…AND…

指定范围

AND &&

OR ||

NOT !

IS NULL

判断为空则TRUE

IS NOT NULL

判断不为空则TRUE

LIKE

如果a能匹配b ,结果为TRUE

IN

如果a在集合b中,结果为TRUE

分页和排序

a.排序


ORDER BY


-- 升序排序ASC 降序排序DESC
SELECT s.`id`,`name` ,`sex`,ifexam
FROM student AS s
LEFT JOIN grade AS g
ON s.id = g.id
ORDER BY s.id ASC

b.分页:缓解数据库压力


LIMIT 起始值,页面的大小


-- 截取显示
SELECT s.`id`,`name` ,`sex`,ifexam
FROM student AS s
LEFT JOIN grade AS g
ON s.id = g.id
ORDER BY s.id ASC
LIMIT 3,6

-- (n-1)*pageSize,pageSize
n:当前页
(n-1)*pageSize:数据行序起始值
pagesize;页面大小
总页数=数据总数/页面大小
MySQL常用函数

​​

​​

​​
-- 数学运算--------
ABS() 绝对值
CEILING() 向上取整
FLOOR() 向下取整
RAND() 返回0-1之间的随机数
SIGN(10) 判断一个数的符号 负数返回-1,整数返回1

--字符串---------
SELECT CHAR_LENGTH -- ('撒大苏打')获取字符串长度
SELECT CONCAT('w','i','n') -- 拼接字符串
SELECT INSERT ('w a b c',1,2,'ss') -- 从某个位置开始替换某个长度
SELECT LOWER('KKK') -- 获取小写字母
SELECT UPPER('lll') -- 获取大写字母
SELECT INSERT('abcde','c') -- 返回第一次查询的字符索引
SELECT REPLACE('铪哈哈','呵呵呵') -- 替换出现的指定字符串
SELECT SUBSTR('ABCD',2,3) -- 返回指定位置字符串
SELECT REVERSE('ABCD') -- 倒序排列

-- 例子
SELECT REPLACE(`name`,'号','屁'),sex,id FROM student
WHERE `name` LIKE '%号%'

--时间和日期函数---------
SELECT CURRENT_DATE() --获取当前日期
SELECT CURDATE() --获取当前日期
SELECT NOW() -- 获取当前时间
SELECT LOCALTIME() --本地时间
SELECT SYSDATE() --获取系统时间

SELECT YEAR(NOW())
SELECT MONTH(NOW())
SELECT DAY(NOW())
SELECT HOUR(NOW())
SELECT MINUTE(NOW())
SELECT SECOND(NOW())

--系统---------
SELECT SYSTEM_USER()
SELECT USER()
SELECT VERSION()


--聚合函数---------
COUNT() --计数行数
COUNT(`属性名`) --会忽略所有null值
COUNT(*) --不会忽略null值,相当于行数
COUNT(1) --不会忽略null值,将所有值都改为1去计算行数
SUM() --求和
AVG() --平均
MAX() --最大
MIN() --最小

​E、MD5加密​ MD5()

-- 插入后加密
UPDATE grade SET studentnumber=MD5(studentnumber)

-- 插入时加密
INSERT INTO grade VALUES(15,MD5(465465),'是')

-- 校验
SELECT * FROM grade WHERE pwd = MD5(6788)

五、事务

1、概念理解


ACID原则:

原子性——要么都完成,要么都失败(转账双方)

一致性——过程一致性,结果一致性(转账金额)

隔离性——排除其他事务对本次事务的影响(其他转账业务)

持久性——数据不因外界原因改变,事务一旦提交不可逆转(关机,支付完成,余额改变,支付失败,余额不变)


脏读:一个事务读取了另外一个事务未提交的数据

不可重复读:一个事务内读取表中某一行数据,多次读取结果不同

虚读(幻读):两次读取结果不同(读取间隔数据改变)

2、执行事务

​MYSQL默认自动开启事务提交​

基本代码

SET autocommit = 0 -- 关闭
SET autocommit = 1 -- 开启

START TRANSACTION -- 标记一个事务的开始,从这里开始的语句都在同一个事务中



COMMIT -- 提交:持久化(成功)

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

-- 事务结束
SET autocommit = 1 -- 开启自动提交

-- 了解
SAVEPOINT -- 设置事务的保存点
ROLLBACK -- 回滚到保存点
RELEASE -- 删除保存点

案例转账

-- 转账
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci;
USE shop;

CREATE TABLE `account`(
id INT(20) 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(`name`,`money`)
VALUES ('A',100),('B',50)

-- 模拟事务转账
SET autocommit = 0; -- 关闭事务自动提交
START TRANSACTION -- 开启事务

UPDATE account SET money = money-20 WHERE `name` = 'A'
UPDATE account SET money = money+20 WHERE `name` = 'B'

COMMIT;-- 提交事务:提交事务以后,回滚失效,不可逆转
ROLLBACK;-- 回滚:失败(未提交)回滚,恢复开启事务初始值

SET autocommit = 1;-- 恢复默认值,开启事务提交

六、索引

​帮助MySQL高效获取数据的数据结构,索引就是数据结构​

(1)分类

1、主键索引(PRIMARY KEY):唯一的标识。主键不可重复,只能有一个列作为主键

2、唯一索引(UNIQUE KEY):避免重复列出现,唯一索引可重复标识

3、常规索引(KEY/INDEX):默认的

4、全文索引(FULLTEXT):快速定位数据

-- 索引的使用:
-- 1、创建表后增加索引
-- 2、创建完毕后增加索引

-- 显示所有索引
SHOW INDEX FROM student

-- 增加全文索引
ALTER TABLE school.student ADD FULLTEXT INDEX `name`(`name`)

-- EXPLAIN 分析sql的执行情况
EXPLAIN SELECT * FROM student;
SELECT * FROM student WHERE MATCH(`name`) AGAINST('号')

-- CREAT INDEX 索引名 ON 表名(列名)

(2)索引原则

不要对经常变动的数据加索引,小数据量不需要加索引,一般加在用在需要经常查询但不常改动的字段上。

(3)MySQL索引背后的数据结构及算法原理

链接:http://blog.codinglabs.org/articles/theory-of-mysql-index.html

七、MySQL备份

1、备份作用

a.保证重要的数据不丢失

b.数据转移

2、备份方式

a.直接拷贝物理文件

b.在可视化工具中手动导出: 在想要导出的表或库,右键选择备份或导出

c.在命令行 mysqldump 命令行使用:

#导出
mysqldump -hlocalhost -uroot -p密码 表名 > D:/xxx.sql

#导入表
mysql -uroot - p12346
use 数据库名
source d:/xxx.sql

#导入库:也可以用上述语句,去掉use
mysql -u用户名 -p密码 库名 > 备份文件

八、权限管理

用户管理命令操作

-- 创建用户 --
CREATE USER plord IDENTIFIED BY '123456'

-- 修改密码 --
-- 当前用户密码
SET PASSWORD = PASSWORD('1111111')
-- 修改指定用户密码
SET PASSWORD FOR plord = PASSWORD('1111111')

-- 重命名用户 --
RENAME USER plord TO PLord

-- 授予“所有”权限,但是没有授权权限 --
GRANT ALL PRIVILEGES ON *.* TO PLord

-- 查询权限 --
SHOW GRANTS FOR PLord
SHOW GRANTS FOR root@localhost---- 创建用户 --
CREATE USER plord IDENTIFIED BY '123456'

-- 修改密码 --
-- 当前用户密码
SET PASSWORD = PASSWORD('1111111')
-- 修改指定用户密码
SET PASSWORD FOR plord = PASSWORD('1111111')

-- 重命名用户 --
RENAME USER plord TO PLord

-- 授予“所有”权限,但是没有授权权限 --
GRANT ALL PRIVILEGES ON *.* TO PLord

-- 查询权限 --
SHOW GRANTS FOR PLord
SHOW GRANTS FOR root@localhost

-- 撤销权限 --哪些权限,在哪个库
REVOKE ALL PRIVILEGES ON *.* FROM PLord

九、数据库设计简要

​当数据库比较复杂时​

(1)良好的数据库:

节省内存空间,数据冗余度低,数据完整性高,便于插入和删除,拒绝使用外键,数据规范。

(2)软件开发数据库:

1、分析需求:分析业务和需要处理的数据库需求

2、概要设计:设计关系图E-R图

3、实现需求和设计

(3)数据库三大范式

1、第一范式 ​​列中值不可分​

要求数据库表的每一列都是不可分割的原子数据项

2、第二范式 ​​每张表只做一件事​

在1NF基础上,在第一范式的基础上,非码属性必须完全依赖候选码,需要保证数据库中每一列都和主键相关

3、第三范式 ​​直接相关​

在1NF基础上,需要保证数据库中每一列都和主键直接相关,而不能存在间接相关

(4)商业化需求 ​​灵活性设计​

1、关联查询的表不能超过三个,以提高数据库性能

2、故意增加某些表增加冗余字段



举报

相关推荐

0 条评论