1、mysql

基本操作

Windows-->Mysql5.7打开

输入用户名和密码

查看数据库 :show databases;查询所有数据库,记住一定要加分号结尾

这里必须全部为 英文空格 英文符号

选择 day4_6数据库:use day4_6;

查看这个数据库的所有表: show tables;

创建命名为westos的数据库:create databases westos;

再次查询所有的数据库:show databases;

  1. show databases;-- 查看所有数据库
  2. mysql> use day4_6 -- 选择数据库中的day4_6
  3. Database changed
  4. show tables;-- 查看day4_6数据库中的所有表
  5. describe student;-- 显示库所有表的信息 没有设计过表或者没有信息则不会显示出来
  6. create database westos;-- 创建一个名为westos的数据集
  7. exit; -- 退出连接
  8. -- 单行注释
  9. /*
  10. 多行注释
  11. */

数据库 语言 crud增删改查

DDL 定义

DML 操作

DQL 查询

DCL 控制

2、操作数据库

这里在Navicat premium中操作

2.1、创建数据库

创建一个名叫 westos的数据表:create database westos;

删除数据库

这里创建了一个day4_27的数据库

在旁边输入命令 drop databases day4_27 这里多输入了一个s 操作不成功

当命令行输入drop database day4_27;则删除成功

使用数据库

选择 westos数据库 :use day4_6;

当数据库是关键字时应该用``两个飘将他包含例如

查看表结构sql语句

show create tbale 表名;

粘贴的语句为:

查看数据库

只执行第二行语句 show tables 查看数据库中的所有表

2.2、数据库的类型

数值

  • tinyint 非常小的数据 1个字节
  • smallint 较小的数据 2个字节
  • mediumint 中等大小的数据 3个字节
  • int 标准的整数 4个字节
  • bigint 较大的数据 8个字节
  • float 单精度浮点数 4个字节
  • double 双精度浮点数 8个字节
  • decimal 字符串形式的浮点数 金融计算

字符串

  • char 字符固定的大小 0-255
  • varchar 可变字符串 0-65535 常量的变量 string
  • tinytext 微型文本 2^8-1
  • text 文本串 2^16-1 保存大文本

时间日期

java.util.Date

  • data YYYY-MM-DD 日期格式
  • time HH:mm:ss 时间格式
  • datetime YY-MM-DD HH:mm:ss 最常用的格式、
  • timestamp 时间戳 1970.1.1到现在的毫秒数!也较为常用
  • year年份的表示

null

空值

2.3、数据库的字段属性(重点)

unsigned:

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

zerofill:

  • 填充0
  • 不足位数的,用0来填充 例如 int(3),输入5 输出结果为005

自增:

  • 自动在上一条的记录上+1
  • 通常设计在唯一的主键~index,必须是整形类型
  • 还可以自定义设置自增的起始值和步长

非空:null和 not null

  • 假设设置为not null 如果不给它赋值就会报错
  • null,如果不填写,默认值就是null还有可能为空白

2.4、创建数据库表

  1. CREATE TABLE `student` (
  2. `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '学号',
  3. `name` varchar(20) DEFAULT '匿名' COMMENT '姓名',
  4. `sex` varchar(10) DEFAULT '男' COMMENT '性别',
  5. `pwd` varchar(20) NOT NULL COMMENT '密码',
  6. `birthday` datetime DEFAULT NULL COMMENT '出生日期',
  7. PRIMARY KEY (`id`)
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8
  1. CREATE TABLE if not exists`student`(
  2. // 当表不存在时 创建student数据表
  3. // 字段名--'id' 列类型--int(字节) 默认值--DEFAULT'' 备注--comment'' AUTO_INCREMENT, //用逗号隔开
  4. AUTO_INCREMENT//表自增
  5. `birthday` datetime NOT NULL,//这里需要版本足够高否则会报错 结尾后最后一个字段不加点,
  6. )

常用命令

show create database student --查看创建数据库的语句 这里student表示数据库

show create table student --查看创建数据库表的语句 这里student表示数据库

desc student --显示数据库表的结构

2.5、数据表的类型

  1. -- 关于数据库引擎
  2. /*
  3. INNODB 默认使用
  4. MYISAM 早些年使用的
  5. */
MYUSAM INNODB
事务支持 不支持 支持
数据行锁定 不支持 支持
外键约束 不支持 支持
全文索引 支持 不支持
表空间大小 较小 较大,约为2倍

常规使用的操作:

  • MYUSAM 节约空间,速度较快
  • INNODB 安全性高,事务的处理,多表多用户操作

物理空间位置

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

  • InnoDB在数据库中只有一个 *.frm 文件,以及上级目录下的ibdata1文件
  • MYSAM 对应文件
    • *.frm 表结构的定义文件
    • *.MYD 数据文件(data)
    • *.MYI 索引文件(index)

设置数据库表的字符集编码

  1. CHARSET=utf8

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

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

在my.ini中配置默认的编码

  1. character-set-server=utf8

2.6、修改删除表

  1. -- 修改表名: alter table 旧表名 RENAME as 新表名
  2. ALTER TABLE student RENAME as studentD
  3. -- 增加表的字段 ALTER TABLE 表名(student2) 添加(ADD) 字段名(age) 列属性int(11)
  4. ALTER TABLE student2 ADD age int(11)
  5. -- 修改表的字段 (重命名,修改约束)
  6. -- ALTER TABLE 表名 MODIFY 字段名 列属性[]
  7. ALTER TABLE studentd MODIFY name VARCHAR(11) -- 修改约束
  8. -- ALTER TABLE 表名 CHANGE 旧名称 新名称 列属性[]
  9. ALTER TABLE studentd CHANGE name name1 int(1) -- 字段重命名
  10. -- 结论:change用来字段的重命名,不能修改字段类型和约束
  11. -- modify不能用来字段的重命名,只能修改字段类型和约束
  12. -- 删除表的字段 ALTER TABLE 表名 drop 字段名
  13. ALTER TABLE studentd drop email

删除

  1. -- 如果 存在student7 则删除
  2. DROP TABLE IF EXISTS student7

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

注意点:

  • `` 字段名用这个包裹
  • 注释用 -- 或者/**/
  • sql 关键字大小写不敏感,建议使用小写
  • 所有的符号全部用英文!

3、MySQL数据管理

3.1外键

3.2DML语言(全部记住)

数据库意义:数据存储 ,数据管理

3.3添加

  1. -- 插入语句 (添加)
  2. -- insert into '表名'('列名') 'VALUES('1')
  3. INSERT INTO `grade`(`gradename`) values('大二')
  4. -- 由于主键自增我们可以省略(如果不写表的字段,会一一匹配)
  5. -- 插入多个字段
  6. insert into `index`(id,xb,age) VALUES('1111','','20')
  1. 语法:**insert into `表名``字段名1``字段名2``字段名3`VALUES'值1'),('值2'),('值3')**
  2. 注意事项:
  3. 1.字段和字段之间使用 英文逗号 隔开
  4. 2.字段是可以省略的,但是后面的值必须要对应
  5. 3.可以同事插入多条数据,values后面的值,需要使用,隔开即可 values()),(),()

3.4修改

update

  1. -- 指定条件下,修改特定的信息 BETWEEN 2 and 3 2-3
  2. UPDATE `index` set `xm`='海儿' where id=1027;
  3. -- 不指定条件的情况下,会改动表中所有的数据
  4. UPDATE `index` set `xm`='小海儿' ;
  5. -- 修改多个属性 需要,逗号隔开
  6. UPDATE `index` set `xm`='小小小海儿' ,`xb`='男',`age`='20' where id=1027;
  7. -- 语法:
  8. -- update 表名 set colum_name=value

语法:update 表名 set colnum_name=value,[colnum_name =value,...]where[条件]

注意:

  • colnum_name 是数据库的列,尽量带上``符号
  • 条件,筛选的条件,如果没有指定,则会修改所有的列
  • value,是一个具体的值,也可以是一个变量
  • 多个设置的属性之间,使用英文逗号隔开

3.5删除

delete 命令

语法:delete from 表名[where 条件]

  1. -- delete命令
  2. -- 删除数据(避免这样写,会全部删除)
  3. DELETE FROM `student`
  4. -- 删除指定数据
  5. DELETE FROM `student3` WHERE id=1;

truncate 命令

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

  1. -- 清空student6
  2. TRUNCATE `student6`

4、DQL查询数据(最重点)

4.1、指定查询字段

  1. -- 查询全部的学生 select字段from
  2. select * from student
  3. -- 查询指定字段
  4. select `StudentNo`,`StudentName` from student
  5. -- 别名,给结果起另外一个名称 as 可以给字段起别名,也可以给表起别名
  6. SELECT `StudentNo` as 学号,`StudentName` as 学生姓名 FROM student as s
  7. -- 函数 concat(a,b)
  8. SELECT CONCAT('姓名:',StudentName) as 新名字 from student

去重 distinct

作用:去除select查询出来的结果中重复的数据,重复的数据只显示一条

  1. SELECT * from result -- 查询全部的考试成绩
  2. select `StudentNo` from result -- 查询有哪些同学参加考试,但发现有重复数据
  3. SELECT DISTINCT `StudentNo` FROM result -- 去重

数据库的列 (表达式)

  1. SELECT VERSION() -- 查询系统版本 5.7.13 函数
  2. SELECT 100*2-100 as 计算结果 -- 用于计算 (表达式)
  3. SELECT @@auto_increment_increment -- 查询自增的步长
  4. -- 学院考试成绩+1分查看
  5. select `StudentNo`,`StudentResult`+1 as '加一分后结果' FROM result

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

4.2 where条件子句

  1. -- =============where==========================
  2. SELECT StudentNo, `StudentResult` from result-- 查询 列属性,`列属性` from 表名
  3. -- 查询成绩在95-100之间
  4. SELECT StudentNo,`StudentResult` FROM result WHERE StudentResult>=80 and StudentResult<=100
  5. -- and 和&&
  6. SELECT StudentNo,`StudentResult` FROM result WHERE StudentResult>=80 && StudentResult<=100
  7. -- 模糊查询(区间) BETWEEN between
  8. SELECT StudentNo,`StudentResult` FROM result WHERE StudentResult BETWEEN 5 and 100
  9. -- 除了1000号学生之外的同学的成绩
  10. select StudentNo, `StudentResult` from result where
  11. StudentNo!=1000
  12. -- 方法二 not
  13. select StudentNo, `StudentResult` from result where
  14. not StudentNo =1000

模糊查询:比较运算符

运算符 语法 描述
is null a is null 当操作符为null,结果为真
is not null a is not null 当操作符不为null,结果为真
between a between b and c 若a在b和c之间,则结果为真
like a like b sql匹配,如果a匹配b,则结果为真
in a in(a1,a2,a3...) 假设a在a1,或者a2...其中的某一个值中,结果为真
  1. -- =============模糊查询========================
  2. -- 查询姓赵的同学
  3. -- like 结合% (代表0到任意个 字符)_(一个字符)
  4. SELECT `StudentNo`,`StudentName` from `student`
  5. where StudentName LIKE '赵%'
  6. -- 查询姓赵的同学,名字后面只有一个字的
  7. SELECT `StudentNo`,`StudentName` from `student`WHERE StudentName like '赵_'
  8. -- 查询姓赵的同学,名字后面只有两个个字的
  9. SELECT `StudentNo`,`StudentName` from `student`WHERE StudentName like '赵__'
  10. -- 查询名字中间有摆字的同学 '%摆%'
  11. SELECT `StudentNo`,`StudentName` from `student`WHERE StudentName like '%摆%'
  12. -- =========in (具体的一个或多个值)==================
  13. -- 查询1001.1002.1003号学员
  14. SELECT `StudentNo`,`StudentName` from `student`WHERE
  15. StudentNo in(1001,1002,1003)
  16. -- 查询在达州 宣汉的学员
  17. SELECT `StudentNo`,`StudentName` from `student`WHERE
  18. Address in('四川达州','四川宣汉')
  19. -- 查询地址为空的的学员
  20. SELECT `StudentNo`,`StudentName` from `student`WHERE
  21. `address`=''or `address` is null

4.3、联表查询

join

  1. -- ================联表查询 join===========================
  2. -- 查询参加考试的同学 (学号,姓名,考试编号,分数)
  3. select * from student
  4. select * from result
  5. /*
  6. 1.分析需求,分析查询字段来自哪些表
  7. 2.确定哪种连接查询? ------------7种
  8. 确定交叉点(这两个表中哪些数据是相同的)
  9. 判断的条件:学生表中的studentNo=成绩表中的studentNo
  10. */
  11. -- jion on 判断条件 连接查询
  12. -- where 等值查询
  13. SELECT s.StudentNo,StudentName,SubjectNo,StudentResult
  14. FROM student as s
  15. INNER JOIN result as r
  16. WHERE s.StudentNo=r.StudentNo
  17. -- Right join
  18. SELECT s.StudentNo,StudentName,SubjectNo,StudentResult
  19. FROM student as s
  20. RIGHT JOIN result as r
  21. on s.StudentNo =r.StudentNo
  22. -- left join
  23. SELECT s.StudentNo,StudentName,SubjectNo,StudentResult
  24. FROM student as s
  25. LEFT JOIN result as r
  26. on s.StudentNo =r.StudentNo
操作 描述
inner join 如果表中至少有一个匹配,就返回行
left join 会从左表返回所有值,即使右表没有匹配
right join 会从右表返回所有值,即使左表中没有匹配
  1. -- 查询 参加考试同学的信息: 学号studentNo,学生姓名studentName。科目名Subjectname,分数studentResult
  2. SELECT s.StudentNo,StudentName,r.SubjectNo,StudentResult
  3. -- 这里曾出现问题表意不明SubjectNo因为result subject表中都有SubjectNo
  4. -- 所以这里的SubjectNo 需要指明 sub 还是r 的表
  5. FROM student s
  6. RIGHT JOIN result as r
  7. on r.StudentNo=s.StudentNo
  8. INNER JOIN `subject` sub
  9. on r.SubjectNo=sub.SubjectNo

自连接

父类

categoryid categoryName
2 信息技术
3 软件开发
5 美术设计

子类

pid categoryid categoryName
3 4 数据库
2 8 办公信息
3 6 web开发
5 7 ps技术

操作:查询父类对应子类关系

父类 子类
信息技术 办公信息
软件开发 数据库
软件开发 web开发
美术设计 ps技术
  1. -- 查询父子信息
  2. select c.categoryname as '父类', d.categoryname as '子类'
  3. FROM category as c,category as d
  4. WHERE c.categoryid=d.pid
  5. -- 查询学院所属的年级(学号,学生的姓名,年级)
  6. SELECT StudentNo,StudentName,GradeName
  7. FROM student as s
  8. INNER JOIN grade g
  9. on s.GradeId=g.GradeId

4.4分页和排序

分页

  1. -- 为什么要分页
  2. -- 缓解数据库压力,给人的体验更好
  3. -- 分页,每页显示五条数据
  4. -- 语法: limit 当前页,页面的大小
  5. SELECT s.`StudentNo`,`StudentName`,`SubjectName`,StudentResult
  6. FROM student s
  7. INNER JOIN `result` r
  8. ON s.`StudentNo`=r.`StudentNo`
  9. INNER JOIN `subject` sub
  10. ON r.`subjectNo`=sub.`subjectNo`
  11. WHERE SubjectName='数据库结构-1'
  12. ORDER BY StudentResult ASC
  13. LIMIT 0,4

5、mysql函数

5.1常用函数

  1. -- 数学运算
  2. SELECT ABS(-10) -- 绝对值
  3. SELECT CEILING(10.2) -- 向上取整
  4. select FLOOR(10.5)-- x下取整
  5. select RAND() -- 生成0-1之间的随机数
  6. select SIGN(100) -- 判断一个数的符号0 就是0 负数返回-1,整数为1
  7. -- 字符串函数
  8. select CHAR_LENGTH('海摆开摆') -- 返回字符串长度
  9. SELECT CONCAT('海儿','还得是海儿') -- 拼接字符串
  10. select INSERT('小小海儿',1,2,'开摆') -- 从某个位置开始替换长度
  11. SELECT UPPER('avc') -- 小写转换大写
  12. select LOWER('ABC') -- 大写转小写
  13. select REPLACE('坚持就能成功','坚持','努力')-- 匹配要换的字体
  14. -- 查询姓 的同学,改成 海儿
  15. SELECT REPLACE(StudentName,'赵','海') from student
  16. where StudentName like '赵%'
  17. -- 时间跟日期函数(记住)
  18. SELECT CURRENT_DATE -- 获取今天日期
  19. select CURDATE() -- 获取今天日期
  20. SELECT now() -- 获取当前时间 精确分秒
  21. SELECT LOCALTIME() -- 本地时间
  22. -- 系统
  23. SELECT SYSTEM_USER()
  24. SELECT USER()
  25. SELECT VERSION()

5.2聚合函数(常用)

函数名称 描述
count() 计数
sum() 求和
avg() 平均值
max() 最大值
min() 最小值
  1. -- =======聚合函数=======
  2. -- 都能够统计表中的数据
  3. SELECT COUNT(`Email`) FROM student -- count(字段),会忽略所有的null null也会计数
  4. SELECT COUNT(*) FROM student
  5. SELECT COUNT(1) FROM student
  6. SELECT SUM(`StudentResult`) as 总和 from result
  7. SELECT avg(`StudentResult`) as 总和 from result
  8. SELECT max(`StudentResult`) as 总和 from result
  9. SELECT min(`StudentResult`) as 总和 from result
  10. -- 查询不同课程的平均分,最高分,最低分,平均分大于80
  11. -- 核心:(根据不同的课程分组)
  12. SELECT `SubjectName`, avg(StudentResult) as 平均分,max(StudentResult) as 最高分, min(StudentResult) as 最低分
  13. FROM result r
  14. INNER JOIN `subject` sub
  15. on r.`SubjectNo`=sub.SubjectNo
  16. GROUP BY r.`SubjectNo`
  17. HAVING 平均分>80

5.3 数据库级别MD5加密

什么是MD5?

主要增强算法复杂度 不可逆。

MD5不可逆,具体的MD5是一样的

MD5破解原理,背后有一个字典,MD5加密后的值,加密前的值

  1. CREATE TABLE testmd5(
  2. `id` INT(4) not NULL,
  3. `name` VARCHAR(20) not null,
  4. `pwd` VARCHAR(50) not null,
  5. PRIMARY KEY(`id`)
  6. )ENGINE=INNODB DEFAULT CHARSET=utf8
  7. -- 铭文密码
  8. INSERT INTO testmd5 VALUES(1,'张三','123456'),(2,'李四','123456'),(3,'王五','123456')
  9. -- 加密
  10. UPDATE testmd5 set pwd=MD5(pwd) WHERE id=1
  11. UPDATE testmd5 set pwd=MD5(pwd) WHERE id!=1
  12. -- 插入时加密
  13. INSERT INTO testmd5 VALUES(4,'小明',MD5('123456'))
  14. -- 如何校验,将用户传递过来的密码,进行md5加密
  15. SELECT * FROM testmd5 WHERE `name`='小明' and pwd=MD5('123456')

6、事务

要么都成功要么都失败

1.sql执行 A给B 转账 A1000->200 B 200

2.sql执行 B收到A转账 A800 ->B400

将一组sql放在一个批次中 去执行~

事务原则:ACID原则 原子性,一致,隔离性,持久性

原子性:要么全部完成,要么全部不完成

一致性:事务前后的数据完整性要保证一致,1000

持久性:事务一旦提交则不可逆,被持久化到数据库中!

隔离性:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所千扰,多个并发事务之间要相互隔离

  1. CREATE DATABASE shop CHARACTER set utf8 COLLATE utf8_general_ci
  2. use shop
  3. CREATE TABLE `account`(
  4. `id` int(3) not null auto_increment,
  5. `name` VARCHAR(30) not null,
  6. `money` DECIMAL(9,2) not null,
  7. PRIMARY key (`id`)
  8. )ENGINE=INNODB DEFAULT CHARSET=utf8
  9. INSERT INTO account(`name`,`money`)
  10. VALUES('A',2000.00),('B',1000.00) -- 金额必须保留两位小数
  11. -- 模拟转账:事务
  12. set autocommit =0;-- 关闭自动提交
  13. START TRANSACTION -- 开启一个事务
  14. UPDATE account set money=money-500 WHERE `name` ='A'-- A500
  15. UPDATE account set money=money+500 WHERE `name` ='B'-- B500
  16. COMMIT; -- 提交事务
  17. ROLLBACK; -- 回滚 --navicat 需要提交事务才能看到结果
  18. set autocommit = 1;

7、索引

mysql 官方对索引的定义为:索引是帮助mysql 高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构

索引的分类

  • 主键索引(primary key)

    • 主键不可重复
  • 唯一索引(unique key)

    - 避免重复的列出现,唯一索引可以重复,多个列都可以标识位
  • 常规索引(key/inedex)
  • 全文索引 FULLTEXT
  1. -- 索引的使用
  2. -- 1、在创建表的时候给字段增加索引
  3. -- 2、创建完毕后增加索引
  4. SHOW INDEX FROM student -- 显示所有的索引信息
  5. -- 增加一个全文索引 (索引名) 列名
  6. ALTER TABLE school.student add FULLTEXT INDEX `haibai`(`StudentName`)
  7. -- explain 分析sql执行的状况
  8. explain select * from student; -- 非全文索引 5
  9. EXPLAIN SELECT * from student where MATCH(StudentName) against('赵'); -- 全文索引

8、 权限管理和备份

8.1、用户管理

SQL可视化管理

  1. -- 创建用户
  2. CREATE USER haibai IDENTIFIED BY '123456'
  3. -- 修改密码(修改当前用户密码)
  4. SET PASSWORD = PASSWORD('123456')
  5. -- 修改密码(修改指定用户密码)
  6. SET PASSWORD FOR haibai = PASSWORD('123456')
  7. -- 错位重命名 RENAME USER 原用户名 TO 新用户名
  8. RENAME user haibai to bobohai; -- 版本不一致这里会报错 需要添加@%
  9. -- 正确重命名
  10. rename user'haibai'@'localhost'to'haibai2'@'localhost';
  11. -- 用户授权 grant all privileges(全部权限)库, to用户
  12. -- all privileges 除了给别人授权 其他都能干
  13. GRANT all PRIVILEGES on *.* to haibai2@localhost
  14. -- 查询权限 show grants for 用户
  15. show grants for 'haibai2'@'localhost' -- 查看指定用户的权限
  16. show grants for 'root'@'localhost' -- 查看root用户权限
  17. -- 撤销权限 REVOKE 权限,在哪个库,哪个表撤销,给谁撤销
  18. REVOKE ALL PRIVILEGES ON *.* FROM haibai2@localhost
  19. -- 删除用户
  20. drop user haibai2@localhost

8.2、mysql备份

为什么要备份:

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

mysql数据库备份方式

  • 直接拷贝物理文件
  • 在可视化工具上导出
  • 使用命令行导出mysqldump 命令行cmd才叫命令行
  1. -- mysqldump -hlocalhost -uroot -p123456 school student >F:/mysqlwenjian/1.sql
  2. -- mysqldup -h主机 u用户名 -p密码 数据库表名 >到Fmysqlwenjian物理磁盘 重命名为1.sql
  3. -- 导入多张表
  4. -- mysqldup -h主机 u用户名 -p密码 数据库表名1 表名2 表名3 >到Fmysqlwenjian物理磁盘 重命名为1.sql
  5. -- 导入数据库
  6. -- mysqldump -hlocalhost -uroot -p123456 school >F:/mysqlwenjian/10.sql

  1. -- source f:/mysqkwenjian/2.sql 导入文件

9、规范数据库设计

9.1、为什么需要设计

当数据库比较复杂的时候,就需要设计了

糟糕的数据库设计

  • 数据冗余,浪费空间
  • 数据的插入和删除都会麻烦、异常【避免使用物理外键】
  • 程序的性能差

良好的数据库设计:

  • 节省内存空间
  • 保证数据库的完整性
  • 方便开发系统

软件开发中,关于数据库的设计

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

设计数据库的步骤:(个人博客

  • 收集信息,分析需求

    • 用户表(用户登录注销,用户的个人信息,写博客,创建分类)
    • 分类表(文章分类,谁创建的)
    • 文章表(文章的信息)
    • 评论表
    • 友链表(友链信息)
    • 自定义表(系统信息,某个关键的字,或者一些主字段)key : value
    • 说说表(发表心情.. id... content....create_time)
  • 标识实体(把需求落地到每个字段)

  • 标识实体 之间的关系

    • 写博客:user--> blog
    • 创建分类:user -> category
    • 关注:user-> user

9.2三大范式

为什么需要数据规范化

  • 信息重复
  • 更新异常
  • 插入异常
    • 无法正常显示信息
  • 删除异常
    • 丢失有效的信息

范式

第一范式(1NF)

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

第二范式(2NF)

前提:满足第一范式

每张表只表示一件事

第三范式(3NF)

前提:满足第一范式

前提:满足第二范式

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

规范性 和 性能的问题

关联查询的表不要超过三张

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

10、JDBC

10.1数据库驱动

驱动:声卡、显卡、数据库

10.2 JDBC

Sun公司为了简化开发人员对数据库的统一的操作,提供了一个(java操作数据库)规范,JDBC

这些规范的实现有具体的厂商去做

对于开发人员来说,我们只需要掌握JDBC的接口操作即可

10.3、第一个JDBC程序

创建测试数据库

1.创建一个普通项目

2.导入数据库驱动

步骤总结:

1、加载驱动

2、链接数据库DriverManager

3、执行sql的对象

4、获得返回的结果集

5、释放链接

  1. //我的第一个jdbc程序
  2. public class JdbcFirstDemo {
  3. public static void main(String[] args) throws Exception {
  4. //1.加载驱动
  5. Class.forName("com.mysql.jdbc.Driver");
  6. //2.用户信息和url
  7. String url="jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true";
  8. String username = "root";
  9. String password="123456";
  10. //3.链接成功,数据库对象
  11. Connection connection = DriverManager.getConnection(url, username, password);
  12. //4执行SQL的对象 statement
  13. Statement statement = connection.createStatement();
  14. //5.执行sql的对象去执行sql
  15. String sql = "select *from users";
  16. ResultSet resultSet = statement.executeQuery(sql);
  17. while (resultSet.next()){
  18. System.out.println("id="+resultSet.getObject("id"));
  19. System.out.println("NAME="+resultSet.getObject("NAME"));
  20. System.out.println("PASSWORD="+resultSet.getObject("PASSWORD"));
  21. System.out.println("email="+resultSet.getObject("email"));
  22. System.out.println("birthday="+resultSet.getObject("birthday"));
  23. }
  24. resultSet.close();
  25. statement.close();
  26. connection.close();
  27. }
  28. }

步骤总结:

1、加载驱动

2、连接数据库 DriverManager

3、获得执行sql的对象Statement

4、获得返回的结果集

5、释放连接

DriverManager

  1. //DriverManager.registerDriver(new com.mysql.jdbc.Driver(0));
  2. Class.forName("com.mysql.jdbc.Driver");//固定写法,加载驱动
  3. Connection connection = DriverManager.getConnection(url, username, password);
  4. //connection 代表数据库
  5. //数据库设置自动提交
  6. //事务提交
  7. //事务滚回
  8. resultSet.close();
  9. statement.close();
  10. connection.close();

URL

  1. String url="jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true";
  2. //mysql --3306
  3. //协议://主机地址:端口号/数据库名?参数1&参数2&参数3
  4. // oralce --1521
  5. // jdcbc:oracle:thin:@localhost:1521:sid

10.4、statement对象

jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。

statement对象的executeupdate方法,用于向数据库发送增、删、改的sql语句,executeupdate执行完后,将会返回一个整数(即增删改语句导致了数据库几行数据发送了变化)。

statement.executeQuery方法用于向数据库发送查询语句,executeQuery方法返回代表查询的结果的ResultSet对象

CRUD操作-create

使用executeUpdate(String sql)方法完成数据添加操作,示列操作:

  1. Statement st= com.createStement();
  2. String sql ="insert into user(...) values(...)";
  3. int num= st.executeUpdate(sql);
  4. if(num>0){
  5. System.out.println("插入成功!!!");
  6. }

CRUD操作-delete

使用executeUpdate(String sql)方法完成数据删除操作,示列操作:

  1. Statement st= com.createStement();
  2. String sql ="delete from user where id=1";
  3. int num= st.executeUpdate(sql);
  4. if(num>0){
  5. System.out.println("删除成功"!!!");
  6. }

CRUD操作-update

使用executeUpdate(String sql)方法完成数据修改操作,示列操作:

  1. Statement st= com.createStement();
  2. String sql ="update user set name='' where name='' ";
  3. int num= st.executeUpdate(sql);
  4. if(num>0){
  5. System.out.println("修改成功"!!!");
  6. }

CRUD操作-read

使用executeQuery(String sql)方法完成数据修改操作,示列操作:

  1. Statement st= com.createStement();
  2. String sql ="select * from user where id=1 ";
  3. int num= st.executeUpdate(sql);
  4. while(rs.next()){
  5. // 根据获取列数据类型,分别调用rs的相应方法映射到java对象中
  6. }

10.5、使用idea链接数据库

  • 点击database,选择+号,再点击date source选择mysql

  • 输入账号密码后点击测试链接

  • 如出现时区问题:则更改下方

  • 写sql语句的地方

  • 修改数据时,回车后,点击DB提交

10.6 事务

狂神说mysql笔记的更多相关文章

  1. MySQL笔记汇总

    [目录] MySQL笔记汇总 一.mysql简介 数据简介 结构化查询语言 二.mysql命令行操作 三.数据库(表)更改 表相关 字段相关 索引相关 表引擎操作 四.数据库类型 数字型 字符串型 日 ...

  2. 涂抹mysql笔记-数据库中的权限体系

    涂抹mysql笔记-数据库中的权限体系<>能不能连接,主机名是否匹配.登陆使用的用户名和密码是否正确.mysql验证用户需要检查3项值:用户名.密码和主机来源(user.password. ...

  3. centos7.2下安装Mysql笔记

    centos7.2下安装Mysql笔记 安装 MySQL 适用于 CentOS 7.0 或以后版本: yum install mariadb mariadb-server 适用于 CentOS 6.8 ...

  4. MySQL笔记(六)游标练习

    23.3.1 Trigger Syntax and Examples 意义不明的几道练习,留着备用. 感觉不好写,而且难以调试..不知道以后会不会有实际的应用场景. 环境:MySQL 笔记(三)由 t ...

  5. mysql 笔记(一)

    mysql 笔记 预留 mysql> use mysql; mysql> grant all privileges  on *.* to root@'%' identified by &q ...

  6. 【MySQL笔记】SQL语言四大类语言

     SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL.   1. 数据查询语言DQL 数据查询语言DQL基本结构是由SELECT子句,FROM子句, ...

  7. Mysql 笔记二

    Mysql 笔记二 Mysql 笔记二 Table of Contents 1. 前言 2. Master Thread 工作方式 2.1. 主循环(loop) 2.2. 后台循(backgroup ...

  8. 深入浅出mysql笔记---1、mysql下载安装

    深入浅出mysql笔记---1.mysql下载安装 一.总结 一句话总结: linux下rpm安装即可 1.linux的wget命令作用? 下载文件的工具:比如wget http://cn.wordp ...

  9. 深入浅出mysql笔记---0、序

    深入浅出mysql笔记---0.序 一.总结 一句话总结: 心得:买书之前建议先找找电子书,纸质书太难带了 1.开源作用? 开源对mysql的发展至关重要 2.mysql在2002年就全面支持了事务, ...

随机推荐

  1. JS 取Json数据中对象特定属性值

    解析JSON JSON 数据 var str = '[{"a": "1","b": "2"}, {"a&quo ...

  2. Docker 06 部署Nginx

    参考源 https://www.bilibili.com/video/BV1og4y1q7M4?spm_id_from=333.999.0.0 https://www.bilibili.com/vid ...

  3. kali下安装Nessus

    Kali安装Nessus 说明 Nessus是一款基于插件的系统漏洞扫描和分析软件 一.安装 1.下载安装包 https://www.tenable.com/downloads/nessus 查看ka ...

  4. windows自动切换深色模式(夜晚模式)

    img { width: 30vw } windows系统上怎么根据日出日落时间判断切换为深色模式或浅色模式呢? windows系统自带了一个叫做"任务计划程序"的软件.可以通过& ...

  5. 深入解析Flutter下一代渲染引擎Impeller

    作者 魏国梁:字节 Flutter Infra 工程师, Flutter Member,长期专注 Flutter 引擎技术 袁    欣:字节 Flutter Infra 工程师, 长期关注渲染技术发 ...

  6. 制作离线yum源

    互联网上操作 1.安装所需依赖环境和软件包 1.1安装命令 yum install yum-utils createrepo 1.2各软件包功能 createrepo :生成yum 源各软件之间的依赖 ...

  7. [CF1537E] Erase and Extend (字符串)

    题面 给一个长度为 n \tt n n 的字符串,你可以进行无限次以下两种操作之一: 删去末尾的字符(此时要保证删去后字符串非空). 把当前整个字符串复制一份,接到自己的后面. 输出最终通过操作能达到 ...

  8. xtrabackup增量备份MySQL-5.7操作说明

    下载工具 本方法利用xtrabackup二进制包,版本是2.4.26 # 从官网下载二进制包:wget https://downloads.percona.com/downloads/Percona- ...

  9. KFS Oracle RAC 数据解析同步配置方法

    一.logminer方式解析 1.数据库配置 - Oracle 1. 数据库中需要先设置 NSL_DATE_FORMAT,命令如下,设置好以后需要重启数据库: ALTER SYSTEM SET NLS ...

  10. dp-位移模型(数字三角形演变)

    由数字三角形问题演变而来下面的题: https://www.cnblogs.com/sxq-study/p/12303589.html 一:规定位移方向 题目: Hello Kitty想摘点花生送给她 ...