数据库
1.什么是数据库
数据库 ( DataBase , 简称DB )
概念 : 长期存放在计算机内,有组织,可共享的大量数据的集合,是一个数据 “仓库”
作用 : 保存,并能安全管理数据(如:增删改查等),减少冗余…
数据库分类
- 关系型数据库 ( SQL )
- MySQL , Oracle , SQL Server , SQLite , DB2 , …
- 通过表和表之间,行和列之间的关系进行数据的存储,,学员信息表,考勤表…
- 非关系型数据库 ( NOSQL ) Not Only
- Redis , MongoDB , …
- 非关系型数据库通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定
DBMS 数据库管理系统
- 数据库管理软件 , 科学组织和存储数据 , 高效地获取和维护数据
- MySQL,数据库管理系统
MySQL简介
概念 : 是现在流行的开源的,免费的 关系型数据库
历史 : 由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。
特点 :
免费 , 开源数据库
小巧 , 功能齐全
使用便捷
可运行于Windows或Linux操作系统
可适用于中小型甚至大型网站应用
官网 : https://www.mysql.com/
压缩包地址:https://dev.mysql.com/get/Downloads/MySQL-5.7.19-winx64.zip
2.数据库安装
配置步骤:
-
解压压缩包至指定位置,环境变量path配置信息(如:D:\execute\mysql-5.7.19\bin)
-
解压目录下添加my.ini文件,配置信息参考
-
[client] port=3306 default-character-set=utf8 [mysqld] # 设置为自己MYSQL的安装目录 basedir=D://execute\mysql-5.7.19 # 设置为MYSQL的数据目录 datadir=D://execute\mysql-5.7.19\data port=3306 character_set_server=utf8 sql_mode=NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER #开启查询缓存 explicit_defaults_for_timestamp=true skip-grant-tables
-
以管理员身份打开命令窗口,依次执行
-
初始化data数据,此过程命令行窗口不会有响应,单文件夹中会进行初始化:mysqld --initialize-insecure --user=mysql
-
输入命令mysqld -install,当看到Service successfully installed时,表示Mysql服务添加成功
-
输入命令net start mysql,启动Mysql服务
-
输入mysql -uroot -p并按下回车键,输入初始化密码,然后即可使用可视化工具连接
sqlyog的安装使用:
- 下载软件后,安装
- 目前可用的一个秘钥:
名称:any
证书秘钥:dd987f34-f358-4894-bd0f-21f3f04be9c1
3.操作数据库
3.1连接数据库命令行
mysql -u root -p123456 --连接数据库
alter user root@localhost identified by '123456'; --修改用户密码
flush privileges; --刷新权限
------------------------------------
--所有的语句都用;结尾
show databases;--查看所有的数据库
use school; --use 数据库名 切换数据库
show tables;--查看所有的表
desc student;--查看名为student表信息
create database westos; --创建一个名为westos的数据库
exit;--退出链接
-- 单行注释
/*
多行注释
*/
**数据库xxx语言 **
DDL 定义
DML 操作
DQL 查询
DCL 控制
3.2 操作数据库
- 创建数据库
CREATE DATABASE `school`CHARACTER SET utf8 COLLATE utf8_general_ci;
2.删除数据库
DROP DATABASE IF EXISTS westos
3.使用数据库
USE `school` --加单引号会变成字段 特殊的字符要加这个符号
4.查看数据库
SHOW DATABASES --查看所有的数据库
数据库的列(数据)类型
数值
tinyint 十分小的数据 1个字节
smallint 较小的数据 2个字节
mediumint 中等大小的数据 3个字节
int 标准的整数 4个字节 常用的
bigint 较大的数据 8个字节
float 浮点数 4个字节
double 浮点数 8个字节
decimal 字符串形式的浮点数 金融计算的时候 一般用decimal
字符串
char 字符串固定大小 0~255
varchar 可变字符串大小 0~65535 对应String
tinytest 微型文本 2^8-1
test 文本串 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
数据库的字段属性(重点)
Unsigned:
无符号的整数
声明了该列不能为负数
zerofill
0填充的
不足的位数,使用0来填充, int(3), 5— 005
非空null not null
假设设置为not null,如果不给它赋值,就会报错!
null 如果不填写值,默认就是null!
默认:
设置默认的值
sex,默认值为男,如果不指定该列的值,则会有默认的值
3.3创建数据库表
/* 每个表,都需要存在以下五个字段 未来做项目用的,表示一个记录存在的意义 拓展
id 主键
'version' 乐观锁
is_delete 伪删除 认为被删除 实际没有
gmt_create 创建时间
gmt_update 修改时间
*/
--AUTO_INCREMENT 自增
--PRIMARY KEY 主键
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT'匿名' COMMENT'姓名',
`paw` 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 -- 显示表的结构
数据表的类型
-- 关于数据库引擎
/*
INNODB 默认使用
MYISAM 早些年用的
*/
MYISAM | INNODB | |
---|---|---|
事务支持 | 不支持 | 支持 |
数据行锁定 | 不支持 | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间大小 | 较小 | 较大,前者两倍 |
常规使用操作:
- MYISAM 节约空间,速度较快
- INNODB 安全性高,事务的处理,多表多用户操作
3.4修改表字段
-- 修改表名 ALTER TABLE 旧表名 RENAME AS 新表名
ALTER TABLE teacher RENAME AS teacher1
-- 增加表的字段 ALTER TABLE 表名 ADD 字段名 列属性
ALTER TABLE teacher1 ADD age INT(11)
-- 修改表的字段(重命名,修改约束)
-- ALTER TABLE 表名 MODIFY 字段名 列属性[]
ALTER TABLE teacher1 MODIFY age VARCHAR(11) -- 修改约束
-- ALTER TABLE 表名 CHANGE 旧名字 新名字 列属性[]
ALTER TABLE teacher1 CHANGE age age1 INT(11) -- 重命名,
-- 删除表的字段 表名 ALTER TABLE 表名 DROP 字段名
ALTER TABLE teacher1 DROP age1
删除表
-- 删除表 DROP TABLE 表名(如果表存在再删除)
DROP TABLE [if exists] teacher1
4.MySQL数据管理
4.1外键
方式一:在创建表的时候,增加约束(麻烦复杂)
CREATE TABLE IF NOT EXISTS `grade` (
`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级id',
`gradename` VARCHAR(10) NOT NULL COMMENT '年级姓名',
PRIMARY KEY(`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
-- 学生表的gradeid字段 要去引用年级表的 gradeid
-- 定义外键key-- KEY `FK_外键名` (`外键名`)
-- 给这个外键添加约束(执行引用) references 引用
-- CONSTRAINT `FK_外键名` FOREIGN KEY (`外键名`) REFERENCES `外键的表名`(`外键名`)
CREATE TABLE IF NOT EXISTS `student` (
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`sex` VARCHAR(2) NOT NULL DEFAULT '男' COMMENT '性别',
`gradeid` INT(10) NOT NULL COMMENT '学生的年级',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`birthday` DATETIME DEFAULT NULL COMMENT '生日',
`address` VARCHAR(20) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR(20) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY(`id`),
KEY `FK_gradeid` (`gradeid`),
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade`(`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
删除有外键关系表的时候,必须要先删除引用外键表的表(从表),再删除外键的表(被引用的表,主表)
方式二:创建表成功后,添加外键约束
CREATE TABLE IF NOT EXISTS `grade` (
`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级id',
`gradename` VARCHAR(10) NOT NULL COMMENT '年级姓名',PRIMARY KEY(`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
-- 学生表的gradeid字段 要去引用年级表的 gradeid
-- 定义外键key-- KEY `FK_外键名` (`外键名`)
-- 给这个外键添加约束(执行引用) references 引用
-- CONSTRAINT `FK_外键名` FOREIGN KEY (`外键名`) REFERENCES `外键的表名`(`外键名`)
CREATE TABLE IF NOT EXISTS `student` (
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`sex` VARCHAR(2) NOT NULL DEFAULT '男' COMMENT '性别',
`gradeid` INT(10) NOT NULL COMMENT '学生的年级',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`birthday` DATETIME DEFAULT NULL COMMENT '生日', `address` VARCHAR(20) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR(20) DEFAULT NULL COMMENT '邮箱', PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
-- 创建表的时候没有外键关系
ALTER TABLE student
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`)
REFERENCES `grade`(`gradeid`);
-- ALTER TABLE 表 ADD CONSTRAINT `FK_外键名` FOREIGN KEY
(`外键名`) REFERENCES `外键的表名(被引用的表)`(`外键名`)
4.2操作数据库语言(DML)
添加insert
INSERT INTO `student`(`name`,`sex`,`pwd`,`address`)VALUES('李3','女','jfow','深圳')
修改update
-- 修改多个属性 用逗号隔开
UPDATE `student` SET `name`='jack',`email`='[email protected]' WHERE id = 1;
删除delete
-- 删除指定数据
DELETE FROM `student` WHERE id=1;
4.3查询数据库语言(DQL)
select完整的语法:
[left | right | inner join table_name] --联合查询
[where ...] -- 指定结果满足的条件
[group by ...] -- 指定结果按照哪几个字段来分组
[having] -- 过滤分组的记录必须满足的次要条件
[order by ...] -- 指定查询记录按一个或多个条件排序
[limit {[offset,]row_count | row_countOFFSET offset}];
-- 指定查询的记录从哪条至哪条
-- 以上语法顺序不能排错、顺序很重要
字段查询:
--查询student表中的所有学生
select * from student
--查询指定的字段
select `id`,`password` from student
--给查询的字段起一个别名 as可以给字段其别名 也可以给表起别名
select `id`,`pssword` as `psw` from student where id = 1
--函数concat(a,b) 拼接字符串
select concat('姓名:',`name`) from student
去重:
SELECT DISTINCT `studentNo` FROM result
where条件:
-- select * from student
select `id` ,`name`,`pssword` from student where pssword >= 70 and pssword <=90 -- 查询密码在70-90之间的
select `id` ,`name`,`pssword` from student where pssword between 70 and 90 -- 70,80,90 模糊查询(闭区间)
select `pssword` from student where not pssword = 100 -- 除了密码是100的其他的密码
-- 查询姓刘的同学
-- like结合 %(代表0到任意字符) _(一个字符)
SELECT `StudentNo`,`StudentName` FROM `student`WHERE StudentName LIKE '刘%';
-- 查询姓刘的同学,名字后只有一个字
SELECT `StudentNo`,`StudentName` FROM `student`WHERE StudentName LIKE '刘_';
-- 查询姓刘的同学,名字后只有两个字
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE StudentName LIKE '刘__';
-- 查询名字中间有嘉字的同学 %嘉%
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE StudentName LIKE '%嘉%';
===================IN(具体的一个或者多个值)===========================
-- 查询1001 1002 1003 学员信息
SELECT `StudentNo`,`StudentName` FROM `student`WHERE StudentNo = 1001
SELECT `StudentNo`,`StudentName` FROM `student`WHERE StudentNo IN (1001,1002,1003);
===================NULL NOT NULL===================================
-- 查询地址为空的学生 null ''
SELECT `StudentNo`,`StudentName` FROM `student`WHERE address=''OR address IS NULL
-- 查询有出生日期的同学 不为空
SELECT `StudentNo`,`StudentName` FROM `student`WHERE `BornDate` IS NOT NULL;
4.4分页和排序
- 分页limit
- 排序order by
-- 为什么要分页
-- 缓解数据库压力,给人的体验更好
-- 分页,每页显示五条数据
-- 语法: limit 当前页,页面的大小
-- limit 0,5 1-5
-- limit 1,5 1-5
-- limit 6,5
SELECT s.`StudentNo`,`StudentName`,`SubjectName`,`StudentResult`
FROM student s
INNER JOIN `result` r
ON s.`StudentNo`=r.`StudentNo`
INNER JOIN `subject` sub
ON r.`subjectNo`=sub.`subjectNo`
WHERE subjectName='数据结构-1'
ORDER BY StudentResult ASC
LIMIT 0,5
-- 第一页 limit 0,5
-- 第二页 limit 5,5
-- 第三页 limit 10,5
-- 第N页 limit 5*(n-1),5
子查询
SELECT `StudentNo`,r.`SubjectName`,`StudentResult`
FROM `result`
WHERE StudentNo=(
SELECT SubjectNo FROM `subject`
WHERE SubjectName = '数据库结构-1'
)
ORDER BY StudentResult DESC
5.Mysql函数
5.1常用函数
-- 数学运算
select ABS(-8) -- 绝对值
select ceiling(9.4) -- 向上取整
select floor(9.4) -- 向下取整
select rand() -- 返回0-1随机数
select sign(-10) -- 判断一个数的符号,负数返回-1,正数返回1
-- 字符串函数
select char_length('abcdesg') -- 返回字符串的长度
select concat('我的数字:','123') -- 拼接字符串
select insert('java',1,2,'abcd') -- 从某个位置开始替换某个长度
select upper('abc') -- 转换成大写
select Lower('ABC') -- 转换成小写
select replace('坚持就能胜利','坚持','努力') -- 替换,坚持替换成努力
-- 查询姓狂的同学,改成姓周的
select replace(name,'狂','周')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()
5.2聚合函数
函数名称 描述 COUNT() 计数 SUM() 求和 AVG() 平均值 MAX() 最大值 MIN() 最小值
SELECT subjectname,AVG(studentresult) AS 平均分,MAX(studentresult) AS 最高分,MIN(studentresult) AS 最低分
FROM result r
INNER JOIN `subject` su
ON r.subjectno=su.subjectno
GROUP BY r.subjectno
HAVING 平均分>80
5.3数据库级别MD5加密(拓展)
CREATE TABLE `testmd5`(
`id` INT(4) NOT NULL,
`name` VARCHAR(20) NOT NULL,
`pwd` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=UTF8
-- 明文密码
INSERT INTO testmd5 VALUES(1,'张三','123456'),(2,'李四','123456'),(3,'王五','123456')
SELECT * FROM testmd5
-- 加密
UPDATE testmd5 SET pwd=MD5(pwd) WHERE id =1
UPDATE testmd5 SET pwd=MD5(pwd) WHERE id !=1 -- 加密全部
-- 插入时加密
INSERT INTO testmd5 VALUES(4,'小明',MD5('123456'))
INSERT INTO testmd5 VALUES(5,'红',MD5('123456'))
-- 如何校验,将用户传递过来的密码,进行MD5加密,然后对比加密后的值
SELECT * FROM testmd5 WHERE `name`='红' AND pwd='123456'
6.事务
6.1、什么是事务
要么全部执行成功,要么全部执行失败
- SQL执行, A给B转账 A 1000–> 200 B200
- SQL 执行, B收到A的钱 A800 — B400
事务原则:
- 原子性:要么都成功,要么都失败
- 一致性:事务前后的数据完整性要保持一致
- 隔离性:事务产生并发时候,互不干扰
- 持久性:事务一旦提交就不可逆转,被持久化到数据库中
隔离产生的问题:
- 脏读:一个事务读取到了另一个事务未提交的数据
- 不可重复读:在一个事务内读取表中的某一行数据,多次读取的结果不同。(这个不一定是错误的,只是场合不对)
- 幻读:在一个事务内读取到了别的事务插入的数据,导致数据前后读取不一致。(一般是行影响,多了一行)
手动执行事务过程:
-- MySQL是默认开启事务自动提交的
set autocommit = 0 -- 关闭
set autocommit = 1 -- 开启(默认)
-- 手动处理事务
set autocommit = 0 -- 关闭自动提交
-- 事务开启
start TRANSACTION -- 标记一个事务的开启,从这个之后的sql都在同一个事务内
-- 提交:持久化(成功)
commit
-- 回滚:回到原来的样子(失败)
ROLLBACK
-- 事务结束
set autocommit = -- 开启事务提交
-- 了解
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(`name`,`money`)
VALUES('A',2000),('B',10000)
-- 模拟转账:事务
SET autocommit = 0; -- 关闭自动提交
START TRANSACTION -- 开启事务(一组事务)
UPDATE account SET money = money-500 WHERE `name` = 'A' -- A 转账给B
UPDATE account SET money = money+500 WHERE `name` = 'B' -- B 收到钱
COMMIT ; -- 提交事务
ROLLBACK ; -- 回滚
SET autocommit=1 -- 恢复默认值
7.索引
MySQL索引的建立对于MySQL的高效运行是最重要的,索引可以大大提高MySQL的减速速度。
索引的作用:
- 提高查询速度
- 确保数据的唯一性
- 可以加速表和表之间的连接,实现表和表之间的参照完整性
- 使用分组和排序子句进行数据检索时,可以显著减少分组和排序的时间
- 全文检索字段进行搜索优化
7.1索引的分类
在一张表中,主键索引只能有一个,可以有多个唯一索引
-
主键索引(PRIMARY KEY):唯一的标识,主键不可重复,只能有一个列作为主键
-
唯一索引(UNIQUE KEY):避免重复的列出现,唯一索引可以重复,多个列都可以标识为唯一索引
-
普通索引(KEY/INDEX):默认的,index,key 关键字来设置
-
全文索引(FULLTEXT):
- 在特定的数据库引擎才有,MyISAM
- 快速定位数据
-- 索引的使用
-- 1.在创建表的时候给字段增加索引
-- 2.创建完毕后,增加索引
-- 显示所有的索引信息
SHOW INDEX FROM 表
-- 增加一个索引
ALTER TABLE 表 ADD FULLTEXT INDEX 索引名(字段名)
-- EXPLAIN 分析sql执行状况
EXPLAIN SELECT * FROM student -- 非全文索引
7.2测试索引
--创建表
CREATE TABLE `app_user` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) DEFAULT '',
`email` VARCHAR(50) NOT NULL,
`phone` VARCHAR(20) DEFAULT '',
`gender` TINYINT(4) UNSIGNED DEFAULT '0',
`password` VARCHAR(100) NOT NULL DEFAULT '',
`age` TINYINT(4) DEFAULT NULL,
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
-- 创建函数插入100万数据
DELIMITER $$ -- 写函数之前必写
CREATE FUNCTION mock_data()
RETURNS INT
BEGIN
DECLARE num INT DEFAULT 1000000;
DECLARE i INT DEFAULT 0;
WHILE i<num DO
-- 插入语句
INSERT INTO app_user(`name`,`email`,`phone`,`gender`,`password`,`age`)
VALUE(CONCAT('用户',i),'[email protected]',FLOOR (CONCAT('18',RAND()*9999999)),FLOOR (RAND()*2),
UUID(),FLOOR (RAND()*100));
SET i = i+1;
END WHILE;
RETURN i;
END;
--执行函数 有点慢正常的
SELECT mock_data();
--查询sql 在未加索引前调用,最好写复杂点,时间增长
SELECT * FROM app_user WHERE NAME IN (SELECT NAME FROM app_user WHERE age>10 AND age<50)
--给name字段添加普通索引 索引命名规则:id_表名_字段名
CREATE INDEX id_app_user_name ON app_user(`name`);
--再次执行sql 观察执行时间
SELECT * FROM app_user WHERE NAME IN (SELECT NAME FROM app_user WHERE age>10 AND age<50)
使用关键字explain分析sql
7.3索引原则
-
索引不是越多越好
-
不要对经常变动的数据加索引
-
小数据量的表不需要加索引
-
索引一般加在常用来查询的字段上
索引的数据结构
-
Hash类型的索引
-
Btree: 默认innodb的数据结构
-
阅读: http://blog.codinglabs.org/articles/theory-of-mysql-index.html
8、权限管理和备份(了解)
8.1、用户管理
SQL命令操作
用户表:mysql.user
本质:对这张表的增删改查
-- 创建用户 CREATE USER 用户名 IDENTIFIED BY '密码'
CREATE USER sanjin IDENTIFIED BY '123456'
-- 修改密码(修改当前密码)
SET PASSWORD = PASSWORD('111111')
-- 修改密码(修改指定用户密码)
SET PASSWORD FOR sanjin = PASSWORD('111111')
-- 重命名 rename user 原名字 to 新名字
RENAME USER sanjin TO sanjin2
-- 用户授权 ALL PRIVILEGES 全部的权限 库,表
-- ALL PRIVILEGES 除了给别人授权,其他都能干
GRANT ALL PRIVILEGES ON *.* TO sanjin2
-- 查询权限
SHOW GRANTS FOR sanjin2 -- 查看指定用户的权限
SHOW GRANTS FOR root@localhost
-- 撤销权限 REVOKE 哪些权限,在哪个库撤销,给谁撤销
REVOKE ALL PRIVILEGES ON *.* FROM sanjin2
-- 删除用户
DROP USER sanjin2
9、数据备份(了解)
9.1sqlyog备份操作
.
9.2sql备份
.
10、规范数据库设计
10.1数据库设计说明
糟糕的数据库设计:
- 数据冗余,浪费空间
- 数据库插入和删除都会麻烦,异常【屏蔽使用物理外键】
- 程序的性能差
良好的数据库设计
- 节省内存空间
- 保证数据库的完整性
- 方便我们开发系统
在软件开发中,关于数据库的设计
- 分析需求:分析业务和需要处理的数据库的需求
- 概要设计:设计关系图E-R图(流程图)
数据库设计步骤
- 分析需求,规划设计需要用的的表
- 标识实体,表结构,需求落实到表字段上
- 标识表与表之间的关系
10.2三大范式
为什么需要数据规范化?
- 信息重复
- 更新异常
- 插入异常
- 删除异常
- 无法正常显示异常
- 丢失有效的信息
三大范式介绍:
- 第一范式:
- 原子性:保证每一列不可再分
- 第二范式:
- 前提:满足第一范式
- 每张表只描述一件事情
- 第三范式:
- 前提:满足第一范式和第二范式
- 需要确保数据表中的每一列数据都和主键直接相关,而不是间接相关
- 规范性和性能的问题
关联查询的表,不得超过三张表(阿里规范守则)
- 考虑商业化的需求和目标(成本和用户体验)数据库的性能更加重要
- 在规范性能的问题的时候,需要适当的考虑一下,规范性
- 故意给某些表加一些冗余的阻断(多表,变成单表)
- 故意增加一些计算列(从大数据量降低为小数据量的查询:索引)
11、JDBC
用于测试的数据库:
CREATE DATABASE jdbcStudy CHARACTER SET utf8 COLLATE utf8_general_ci;
USE jdbcStudy;
CREATE TABLE `users`(
id INT PRIMARY KEY,
NAME VARCHAR(40),
PASSWORD VARCHAR(40),
email VARCHAR(60),
birthday DATE
);
INSERT INTO `users`(id,NAME,PASSWORD,email,birthday)
VALUES(1,'zhansan','123456','[email protected]','1980-12-04'),
(2,'lisi','123456','[email protected]','1981-12-04'),
(3,'wangwu','123456','[email protected]','1979-12-04')
添加依赖:
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
步骤总结:
- 加载驱动
- 连接数据库DriverManager
- 获取执行sql的对象statement
- 获得返回的结果集
- 释放连接
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class TestJDBC {
public static void main(String[] args) throws Exception{
//1. 加载驱动
Class.forName("com.mysql.jdbc.Driver");//固定写法
//2. 用户信息和url
//useUnicode=true&characterEncoding=utf8&&useSSL=true
String url ="jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&&useSSL=false";
String name = "root";
String password = "123456";
//3. 连接成功,返回数据库对象 connection代表数据库
Connection connection= DriverManager.getConnection(url,name,password);
//4. 执行SQL的对象 statement 执行SQL的对象
Statement statement = connection.createStatement();
//5. 执行SQL的对象 去执行SQL 可能存在结果,查看返回结果
String sql="SELECT * FROM users";
//执行查询Sql executeQuery()
ResultSet resultSet = statement.executeQuery(sql);//返回的结果集,结果集中封装了我们全部查询的结果
while(resultSet.next()){
System.out.println("id+"+resultSet.getObject("id"));
System.out.println("name+"+resultSet.getObject("NAME"));
System.out.println("password+"+resultSet.getObject("PASSWORD"));
System.out.println("email+"+resultSet.getObject("email"));
System.out.println("birthday+"+resultSet.getObject("birthday"));
}
String sql2 = "insert into users(`id`,`name`,`password`,`email`)values(5,'lzl测试','123123','[email protected]')";
////执行更新Sql executeUpdate()
int i = statement.executeUpdate(sql2);
//6. 释放连接
resultSet.close();
statement.close();
connection.close();
}
}
参考博客地址:https://blog.csdn.net/m0_60139894/article/details/121757701
标签:VARCHAR,--,数据库,DEFAULT,Mysql,NULL,select From: https://www.cnblogs.com/lzlbk-321/p/17356050.html