MySQL入门

Xnip2021-04-20_17-07-21

一、初识MySQL

1.1百度百科

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。

1.2数据库概念

数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。

1.3基本命令行操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mysql -u root -p --连接数据库

exit; ---退出数据库

--------------------------------------------
--所有语句都用;结尾
show databases;--查看所有的数据库

use database name;--查看某一个数据库

show tables;--显示数据库里面的所有表的信息

describe table name;--显示数据库中某个表的信息

creat database name;--创建一个数据库

--单行注释
/*




*/

1.4、数据库语言

DDL:定义

DML:操作

DQL:查询

DCL:控制

二、操作数据库

2.1基本语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
-- 创建一个表
CREATE TABLE `student`(
`id` INT(4) NOT NULL COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '张三' COMMENT '姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123' 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 CHARACTER SET = utf8;


SHOW CREATE DATABASE school;--查看创建数据库的语句
SHOW CREATE TABLE student;--查看创建表的语句
DESC student;--显示表的结构


-- 修改表的名字
ALTER TABLE test RENAME AS test01
-- 增加表的字段
ALTER TABLE test01 ADD age INT(11)
-- 修改表的字段
ALTER TABLE test01 MODIFY age VARCHAR(11)-- 修改约束
ALTER TABLE test01 CHANGE age age1-- 重命名
-- 删除表的字段
ALTER TABLE test01 DROP age1
-- 删除表(如果存在)
DROP TABLE IF EXITS teacher1

2.2数据库引擎

  • 默认使用INNODB,5.7以上版本
  • MYISAM早些版本
MYISAM INNODB
事务支持 不支持 支持
数据行锁定 不支持 支持
外键约束 不支持 支持
全文索引 不支持 支持
表空间大小 较小 较大,约为MYISAM两倍
  • MYISAM 节约空间,速度较快
  • INNODB 安全性高,事务的处理,多表多用户操作

三、mysql数据管理

3.1外键

image-20210420170317025

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE TABLE `grade`(
`gradeid` INT(10) NOT NULL COMMENT '年级id',
`gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
PRIMARY KEY(`gradeid`)
)ENGINE=INNODB DEFAULT CHARACTER SET = utf8;

CREATE TABLE `student`(
`id` INT(4) NOT NULL COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '张三' COMMENT '姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123' COMMENT '密码',
`sex` VARCHAR(2) NOT NULL DEFAULT '男' COMMENT '性别',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`gradeid` INT(10) NOT NULL COMMENT '学生的年级',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY(`id`),
KEY `FK_gradeid` (`gradeid`),
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade`(`gradeid`)

)ENGINE=INNODB DEFAULT CHARACTER SET = utf8;
1
2
ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade`(`gradeid`);
  • 以上都是物理外键,数据库级别的外键,为了避免数据库或多,一般不使用。

  • 外键在应用级别实现。

四、MySQL函数

官方文档:https://dev.mysql.com/doc/refman/5.7/en/sql-function-reference.html

1、常用函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- 数学运算
SELECT ABS(-8) -- 返回 8 , 绝对值
SELECT CEILING(9.4) -- 返回 10 , 向上取整
SELECT FLOOR(9.4) -- 返回 9 , 向下取整
SELECT RAND() -- 返回 0~1之间的随机数
SELECT SIGN(10) -- 返回 1,判断一个数的符号, 0-0 ,负数 - -1 ,正数 - 1
SELECT AVG() -- 返回参数的平均值
-- 字符串函数
SELECT CHAR_LENGTH('我的长度是六')-- 字符串长度
SELECT CONCAT('你''好') -- 拼接字符串
SELECT LOWER('ABC') -- 变成小写字母
SELECT UPPER('abc') -- 变成大写字母
-- 时间和日期
SELECT CURRENT_DATE() -- 获取当前日期
SELECT NOW() -- 获取当前时间
SELECT LOCALTIME() -- 获取本地时间
SELECT SYSDATE() -- 系统时间

2、聚合函数

1
2
3
4
5
6
7
8
9
10
-- 查询一个表有多少记录
SELECT COUNT([列名]) FROM <表名> -- 统计表里面的列名,不会忽略null
SELECT COUNT(*) FROM <表名> -- 包含了所有的列,相当于行数,不会忽略null,计算行数
SELECT COUNT(1) FROM <表名> -- 忽略了所有的列,用1代表代码行,不会忽略null,计算行数

-- 计算
SUM() -- 总和
AVG() -- 平均值
MAX() -- 最大值
MIN() -- 最小值

五、DML操纵数据语言

Data Manipulation Language, DML数据操纵语言,用于数据库操作,对数据库其中的对象和数据运行访问工作的编程语句

  • insert
  • updat
  • delete

1、添加

1
2
3
4
-- 插入语句(添加)
-- insert into 表名([字段1,字段2,字段3,字段4])values ('值1','值','值'),('值2','值','值'),('值3'),('值4'),....
INSERT INTO `grade` (`gradename`) VALUES('大四')
-- 注意要一一对应

2、修改

1
2
3
4
5
6
7
8
-- 修改指定的信息
UPDATE `student` SET `name`='nie' WHERE id = 1;
-- 修改所有的信息
UPDATE `student` SET `name`='nie'
-- 修改多个属性,逗号隔开
UPDATE `student` SET `name`='nie',`email`='111@163.com' WHERE id = 1;
-- value可以是一个变量
updata `user` set `Host` = '%' where `User`='root';
操作符 含义
= 等于
<>或!= 不等于
> 大于
< 小于
<= 大于等于
>= 小于等于
between…and.. 闭合区间
and &&
or ||

3、删除

1
2
3
4
5
6
7
-- 删除所有数据
DELETE FROM `student`
-- 删除指定数据
DELETE FROM `student` WHERE id = 1;
-- 完全清空数据库的表,表的结构和索引约束不会变
TRUNCATE `student`

清空表的两种操作的区别:

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

六、DQL查询数据语言

1、DQL

Data QueryLanguage 数据查询语言

  • select基本语法

    1
    2
    3
    4
    5
    6
    7
    8
    SELECT [ALL|DISTINCT] <目标列表达式> [AS 列名]
    [,<目标列表达式> [AS 列名] ...] FROM <表名> [,<表名>…]
    [left | right | inner join table_name2]-- 联合查询
    [WHERE...]-- 指定结果需满足的条件
    [GROUP BY...]-- 指定结果按照哪几个字段来分组
    [HAVING...] -- 过滤分组的记录必须满足的次要条件
    [ORDER BY...]-- 指定查询记录按一个或者多个条件排序
    [LIMIT {[offset,]row_count | row_countOFFSET offset}];-- 指定查询的记录从哪条到哪条

2、指定查询字段

1
2
3
4
5
6
7
8
-- 查询全部的学生
SELECT * FROM student
-- 查询指定字段
SELECT `StudentNo`,`StudentName` FROM student
-- 别号,给结果起一个名字
SELECT `StudentNo` AS 学号,`StudentName` AS 姓名 FROM student
-- 函数 concat(a,b)拼接字段
SELECT CONCAT('姓名:',StudentName)AS 新名字 FROM student

3、去重distinct

  • 作用:去除一些重复的数据
1
2
3
-- 查询一下有哪些同学参加了考试,成绩(因为有的人参加了多门考试)
SELECT DISTINCT `StudentNo` FROM result

  • 使用数据库的列(表达式)
1
2
-- 给每个人的成绩加1
SELECT `StudentResult`+1 AS '提分后的成绩' FROM result

4、where条件子句

检索数据中符合条件的值

运算符 语法 描述
and && a and b a&&b 逻辑与
or || a or b a||b 逻辑或
not ! not a ! a 逻辑非

尽量使用英文字母

1
2
3
4
5
6
-- 查询90-100的成绩(AND)
SELECT studentNo,`StudentResult` FROM result
WHERE StudentResult>=90 AND StudentResult<=100
-- 查询90-100的成绩(&&)
SELECT studentNo,`StudentResult` FROM result
WHERE StudentResult>=90 && StudentResult<=100

5、模糊查询

运算符 语法 描述
IS NULL a is null 如果操作符为null,结果为真
IS NOT NULL a is not null 如果操作符不为null,结果为真
BETWEEN AND 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
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-- 查询姓王的同学
-- 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 '%王%'

-- 查询100,101,102号学生
SELECT studentNo,`StudentName` FROM `student`
WHERE StudentNo IN (100,101,102);

-- 查询在北京的学生
SELECT studentNo,`StudentName` FROM `student`
WHERE `Address` IN ('北京');

6、联表查询

Xnip2021-04-21_08-44-07

1
2
3
4
5
6
7
8
-- 查询参加了考试的同学的(学号,姓名,科目编号,分数)
SELECT * FROM student
SELECT * FROM result


SELECT s.studentNo,studentName,subjectNo,studentResult FROM student AS s
INNER JOIN result AS r
ON s.studentNo = r.studentNo
操作 描述
Inner join 如果表中至少有一个匹配,就返回匹配的值
left join 返回左表中的所有值,即使右表中没有匹配
right join 返回右表中的所有值,即使左表中没有匹配

7、自连接

自己的表和自己的表连,核心:一张表拆为两张一样的表

  • 例如下表category

    categoryid pid categoryName
    7 5 ps技术
    6 3 web开发
    2 1 信息技术
    3 2 办公技术
    4 3 数据库
    5 1 美术设计
    3 1 软件开发
  • -- 查询父子信息
    SELECT a.`categoryName` AS '父栏目', b.`categoryName` AS '子栏目'
    FROM `category` AS a, `category` AS b
    WHERE a.`categoryid` = b.`pid`
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

    - 结果如下

    | 父栏目 | 子栏目 |
    | -------- | -------- |
    | 软件开发 | 数据库 |
    | 软件开发 | web开发 |
    | 美术设计 | ps技术 |
    | 信息技术 | 办公技术 |



    ### 8、分页和排序

    - 排序

    ```sql
    -- 排序:升序 ASC , 降序 DESC
    -- 把学生成绩按照降序排
    ORDER BY StudentResult DESC
    -- 把学生成绩按照升序排
    ORDER BY StudentResult ASC

  • 分页

1
2
3
4
5
6
7
8
-- 分页, 语法:limit 起始位置,数据行数
-- 每页只显示五条数据
LIMIT 0,5

-- 第一页 LIMIT 0,5 (1-1)*5
-- 第二页 LIMIT 5,5 (2-1)*5
-- 第三页 LIMIT 10,5 (3-1)*5
-- 第N页 LIMIT x,5 x=(n-1)*pageSize, [pageSize:页面大小]

9、嵌套查询

Where(计算的值)

在where语句里面嵌套一个子查询语句

  • 使用子查询进行基于集合的查询
1
2
3
4
5
6
-- 查询与张三同学在同一个系的同学
-- 第一步先查询张三同学所在的系
-- 然后把系作为已知条件查找同学信息
SELECT * FROM Student
WHERE Sdept IN(
SELECT Sdept FROM Student Where Sname ='张三');
  • 使用子查询进行比较查询
1
2
3
4
5
6
-- 查询选修了语文课程且课程成绩高于此课程平均成绩的的学生学号和该门课成绩
-- 先查出语文课程的平均成绩
-- 然后把平均成绩作为已知条件查找同学学号和成绩
SELECT Sno, Grade FROM SC
WHERECno='语文' AND Grade>(
SELECT AVG(Grade) FROM SC Where Cno ='语文') ;

七、事务

1、概述

事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transactionend transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

2、事务原则:ACID原则

参考博客:https://blog.csdn.net/dengjili/article/details/82468576

  • Atomicity原子性

    原子性任务是一个独立的操作单元,是一种要么全部是,要么全部不是的原子单位性的操作。

  • Consistency一致性

    一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。

  • Isolation隔离性

    事务是并发控制机制,他们交错使用时也能提供一致性。隔离让我们隐藏来自外部世界未提交的状态变化,一个失败的事务不应该破坏系统的状态。隔离是通过用悲观或乐观锁机制实现的。

  • Durability耐久性

    如果服务器宕机,事务若没有提交,就恢复到之前的状态;若提交,就持久化到数据库了。

隔离导致的问题

  • 脏读

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

  • 不可重复读

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

  • 虚读(幻读)

    是指在一个事务内读取到了别的事务插入的数据,导致前后读取数量总量不一致。
    (一般是行影响,如下图所示:多了一行)

3、具体操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-- mysql是默认开启事务的自动提交的
SET autocommit = 0 -- 关闭
SET autocommit = 1 -- 开启

-- 手动处理事务
SET autocommit = 0 -- 关闭

-- 事务开始
START TRANSACTION -- 标记一个事务的开始,从这个之后sql都在同一个事务内
INSERT xx
INSERT xx
-- 提交:持久化(成功!)
COMMIT
-- 回滚:回到原来的样子(失败!)
ROLLBACK

-- 事务结束
SET autocommit = 1 -- 开启


SAVEPOINT <保存点名> -- 设置一个事务的保存点
ROLLBACK TO SAVEPOINT <保存点名> -- 回滚到保存点
RELEASE SAVEPOINT <保存点名> -- 撤销保存点

4、模拟转账的事务

  • 建立一个account表

    1
    2
    3
    4
    5
    6
    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;
  • 插入一些数据

    id name money
    1 A 1000.00
    2 B 500.00
  • 开始事务

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    -- 模拟转账的事务
    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 -- 开启自动提交
  • 结果

    id name money
    1 A 500.00
    2 B 1000.00
  • 过程模拟

    这个过程包含两个步骤

    A:1000 - 500 = 500
    B: 500 + 500 = 1000

    原子性表示,这两个步骤一起成功,或者一起失败,不能只发生其中一个动作,并且在提交过后就被持久化到数据库里面了,不可被回滚。

八、索引

1、概念

在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。

2、分类

  • 主键索引(PRIMARY KEY)

    唯一标识,主键不可重复

  • 唯一索引(UNIQUE KEY)

    避免重复的列,可以重复,多个列都可以标识为唯一索引

  • 常规索引(KEY/INDEX)

    默认的,index/key来设置

  • 全文索引(FULLTEXT)

    快速定位数据

3、基本语法

1
2
3
4
5
6
7
8
9
10
-- 显示所有的索引信息
SHOW INDEX FROM student

-- 增几个全文索引(索引名) 列名
ALTER TABLE school.student ADD FULLTEXT INDEX `studentName`(`studentName`);

-- EXPLAIN 分析sql的执行状况
EXPLAIN SELECT * FROM student; -- 非全文索引

EXPLAIN SELECT * FROM student WHERE MATCH(studentName) AGAINST('王');

4、使用

建表app_user:

1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE `app_user` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT '' COMMENT '用户昵称',
`email` varchar(50) NOT NULL COMMENT '用户邮箱',
`phone` varchar(20) DEFAULT '' COMMENT '手机号',
`gender` tinyint(4) unsigned DEFAULT '0' COMMENT '性别(0:男;1:女)',
`password` varchar(100) NOT NULL COMMENT '密码',
`age` tinyint(4) DEFAULT '0' COMMENT '年龄',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='app用户表'

批量插入数据:100w

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DROP FUNCTION IF EXISTS mock_data;
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`)
VALUES(CONCAT('用户', i), '24736743@qq.com', CONCAT('18', FLOOR(RAND()*(999999999-100000000)+100000000)),FLOOR(RAND()*2),UUID(), FLOOR(RAND()*100));
SET i = i + 1;
END WHILE;
RETURN i;
END;
SELECT mock_data();
set global log_bin_trust_function_creators=1;

索引效率测试

无索引

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT * FROM app_user WHERE name = '用户9999'; -- 查看耗时
SELECT * FROM app_user WHERE name = '用户9999';
SELECT * FROM app_user WHERE name = '用户9999';

mysql> EXPLAIN SELECT * FROM app_user WHERE name = '用户9999'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: app_user
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 992759
filtered: 10.00
Extra: Using where
1 row in set, 1 warning (0.00 sec)
1
2
3
4
5
6
-- CREATE INDEX 索引名 ON 表(`字段`)
CREATE INDEX id_app_user_name ON app_user(`name`)

-- 使用
SELECT * FROM app_user WHERE `name` ='用户100000';

索引在数据非常多的时候,可以极大的提高查找速度

5、索引原则

  • 不要对经常变动的数据加索引
  • 不要对小数据加索引
  • 索引一般加在经常查询的大量数据的字段上

6、 索引底层原理

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

6.1、为什么需要索引

索引的作用是做数据的快速检索,而快速检索的实现的本质是数据结构。通过不同数据结构的选择,实现各种数据快速检索。在数据库中,高效的查找算法是非常重要的,因为数据库中存储了大量数据,一个高效的索引能节省巨大的时间。比如下面这个数据表,如果 Mysql 没有实现索引算法,那么查找 id=7 这个数据,那么只能采取暴力顺序遍历查找,找到 id=7 这个数据需要比较 7 次,如果这个表存储的是 1000W 个数据,查找 id=1000W 这个数据那就要比较 1000W 次,这种速度是不能接受的。

6.2、Mysql 索引底层数据结构选型(B+树)

  • B树的特点可以总结为如下:
    • 关键字集合分布在整颗树中。
    • 任何一个关键字出现且只出现在一个节点中。
    • 搜索有可能在非叶子节点结束。
    • 其搜索性能等价于在关键字集合内做一次二分查找。
    • B树在插入删除新的数据记录会破坏B-Tree的性质,因为在插入删除时,需要对树进行一个分裂、合并、转移等操作以保持B-Tree性质。
  • 作为B树的加强版,B+树与B树的差异在于
    • 有n棵子树的节点含有n个关键字(也有认为是n-1个关键字)。
    • 所有的关键字全部存储在叶子节点上,且叶子节点本身根据关键字自小而大顺序连接。
    • 非叶子节点可以看成索引部分,节点中仅含有其子树(根节点)中的最大(或最小)关键字。
  • B+树的特性如下:
    • 所有关键字都存储在叶子节上,且链表中的关键字恰好是有序的。
    • 不可能非叶子节点命中返回。
    • 非叶子节点相当于叶子节点的索引,叶子节点相当于是存储(关键字)数据的数据层。
    • 更适合文件索引系统。

九、权限管理和备份

1、权限管理

2、mysql备份

  • 直接拷贝物理文件

  • 可视化操作导出

  • 使用命令行

    1
    2
    3
    4
    5
    #导出
    mysqldump -h 主机名 -u 用户名 -p 密码 数据库 表名 >位置
    #导入
    mysql -u 用户名 -p 密码
    source 位置

十、规范数据库设计

1、作用

  • 节省内存空间
  • 保证数据库完整性

2、过程

  • 分析需求,收集信息
  • 概要设计:设计关系图E-R图

3、三大范式

https://www.cnblogs.com/wsg25/p/9615100.html

3.1、第一范式(1NF)

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

3.2、第二范式(2NF)

在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)

第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。

3.3、第三范式(3NF)

在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)

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

3.4、规范性和性能的问题

关联查询不得超过三张表

十一、JDBC

1、数据库驱动

2、JDBC

2.1、概念

Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。

2.1、概念

3、使用

  • 加载驱动
  • 连接数据库
  • 获取执行sql的对象
  • 返回的结果集
  • 释放连接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//1.加载mysql数据库驱动
static String driverName = "com.mysql.jdbc.Driver";
//2.加载oracle数据库驱动
//static String driverName = "oracle.jdbc.driver.OracleDriver";
//3.加载SQL Server数据库驱动
//static String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
static String url = "jdbc:mysql://127.0.0.1:3306/mysql";
static String username = "root";
static String password = "123456";
public void getConnection() {
try {
// 1.1、加载驱动,使用Class.forName()将驱动类加载到内存
Class.forName(driverName);
//1.2或者使用
//Driver driver = (Driver) Class.forName(driverName).newInstance();
// 2.1、获取connection
Connection conn = DriverManager.getConnection(url,username,password);
//2.2或者使用
/* Properties info = new Properties();
info.put("user", username);
info.put("password", password);
Connection conn = driver.connect(url, info);
*/
System.out.println(conn);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}

}

SQL注入

1
" ' or '1=1 "

sql存在漏洞,会被拼接

  • 使用preparedstatement对象防止sql注入

https://www.zhihu.com/question/65502802/answer/802678798