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、故意增加某些表增加冗余字段