1.初识MySQL
JDBC:Java Database Connectivity
腾讯云镜像源:https://mirrors.cloud.tencent.com
2.安装MySQL
-
下载安装包解压
-
添加到环境变量:将bin文件夹路径加到path变量中
-
编写配置文件my.ini
[mysqld] basedir=D:\tools\mysql-5.7.33-winx64\ datadir=D:\tools\mysql-5.7.33-winx64\data\ port=3306 #跳过密码 skip-grant-tables
-
用管理员权限进入到bin目录下,执行
mysqld -install
,安装MySQL -
初始化MySQL,
mysqld --initialize-insecure --user=mysql
-
启动MySQL,
net start mysql
,如果提示找不到文件,可能是mysql服务的路径与安装的路径不一致导致,修改注册表中的安装路径即可 -
进入MySQL,
mysql -u root -p
,不用输密码,直接跳过 -
修改密码:
update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost';
-
最后输入
flush privileges
刷新权限 -
修改配置文件,注释掉跳过密码
3.安装SQLyog
4.命令行操作数据库
如果表名是特殊字符,查询时可以加符号区分
select user from school
select `user` from school --加字符区分特殊字符
5.关于数据库引擎
/*
INNODB 现在默认使用的
MYISAM 早些年使用的
*/
MYISAM | INNODB | |
---|---|---|
事务支持 | 不支持 | 支持 |
数据行锁定 | 不支持 | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间的大小 | 较小 | 较大(2倍) |
6.表的修改与删除
表的修改:关键字 ALTER
表的删除:关键字 DROP
7.数据库的外键
作用:保持数据的一致性
缺点:当表数量过多或外键较多时,数据库性能较差
8.增删改查
添加数据
-- 插入语句(添加)
-- insert into 表名([字段名1,字段名2,字段名3]) values ([值1,值2,值3])
-- 一般写插入语句时,我们一定要一一对应,否则会自动一一匹配导致报错
INSERT INTO `student`(`name`,`pwd`,`sex`) VALUES('张三','AAA','男')
删除数据
-- 删除数据
DELETE FROM `student` WHERE id = 1;
TRUNCATE:删除数据库]\
作用:完全情况一个数据库表,表的结构和约束不会变
TRUNCATE TABLE `student`
delete和 TRUNCATE 的区别
- 相同点:都能删除数据,但不会删除表结构和约束
- 不同:
- TRUNCATE 重新设置自增列,计数器会归零
- TRUNCATE 不会影响事务
修改数据
-- 修改学员的名字,如果不带where则会修改所以的数据
UPDATE `student` SET `name`='李思思' WHERE `id`=1
-- 修改多个属性,用逗号(英文)隔开
UPDATE `student` SET `name`='李四',`age`=99 WHERE `id` =2
-- 语法
-- UPDATE 表名 SET colnum_name =value,... where 条件
where 语句运算符
操作符 | 含义 | 范围 | 结果 |
---|---|---|---|
= | 等于 | 5=6 | false |
<>或!= | 不等于 | 5<>6 | true |
> | |||
< | |||
<= | |||
>= | |||
BETWEEN…AND … | 在某个范围内,两头都是闭区间 | [2,5] | |
AND | |||
OR |
语法:UPDATE 表名 SET colnum_name =value,… where 条件
9.DQL查询数据(最重点)
9.1、DQL
- 所有的查询操作都用它 Select
- 简单的查询,复杂的查询都能做
- 数据库中最核心的语言,最重要的语句
- 使用频率最高的语句
9.2、查询所有的字段
-- 查询所有的学生
SELECT * FROM student
-- 查询指定字段,字段之间用逗号隔开
SELECT `StudentNo`,`syudentName` FROM studnet
-- 别名,给结果起一个名字 AS
SELECT `StudentN0` AS 学号,`StudentName` AS 学生姓名 FROM student
-- 函数 Concat(a,b) ,将查询出的结果按函数要求拼接
SELECT CONCAT('姓名:',StudentName) AS 姓名字 FROM student
语法:SELECT 字段... FROM 表名
SELECT 完整语法
-- JOIN
-- WHERE
-- GROUP BY
-- HAVING
-- ORDER BY
-- LIMIT
去重 distinct
作用:去除SELECT查询出来的结果中重复的数据
-- 查询一下有哪些同学参加了考试,会产生重复问题
SELECT `StudentNo` FROM result
-- 用DISTINCT关键字去重
SELECT DISTINCT `StudentNo` FROM result
数据库的列(表达式)
SELECT VERSION() -- 查询版本
SELECT 100*3-1 AS 计算结果 -- 用来计算
SELECT @@auto_increment_increment -- 查询自增的步长
-- 学员考试成绩+1分查看
SELECT `StudentNo`,`StudentResult`+1 AS 提分后 FROM result
数据库中的表达式:文本值,列,NULL,函数,计算表达式,系统变量…
语法:select 表达式 from 表
9.3、where 条件语句
作用:检索数据中符合条件的值
逻辑运算符
运算符 | 语法 | 描述 |
---|---|---|
and && | a and b a&&b | |
or || | a or b a || b | |
not != | not a != a |
模糊查询:比较运算符
运算符 | 语法 | 描述 |
---|---|---|
IS NULL | ||
IS NOT NULL | ||
BETWEEN | ||
LIKE | a like b | SQL匹配,如果a匹配到b,则结果喂真 |
IN | a in (a1,a2,a3) |
-- 模糊查询
-- 查询姓刘的同学
-- like结合 %(代表0到任意个字符) _(代表一个字符)
SELECT `StudentNo`,`StudentName` FROM student WHERE StudentName like '刘%'
-- in (具体的一个或多个值,不能用%等通配符)
-- 查询 1001 1002 1003号学员
SELECT `StudentNo`,`StudentName` FROM student WHERE StudentNo IN (1001,1002,1003)
9.4、联表查询:join
/* 思路
1. 分析需求,分析查询的字段来自哪些表
2. 确定使用哪种查询? 7种
3. 确定交叉点(两个表中哪个数据时相同的)
*/
-- 为避免系统无法确定返回哪个表中的studentNo,用s.studentNo指定返回数据的来源
SELECT s.StudentNo,studentName,SubjectNo,StudentResult
FROM student AS s
INNER JOIN result AS r
on s.studentNo = r.studentNo
-- join (连接的表) on (判断的条件) 连接查询
-- where 等值查询
-- 两者查询的结果一样
-- 三表查询
SELECT s.studentNo,studentName,subjectNo,subjectName
FROM student s
RIGHT JOIN result r
ON s.studentNo = s.studentNo
INNER JOIN subject sub
ON r.subjuectNo = sub.subjectNo
-- 思路--------
-- 我要查询哪些数据 select ...
-- 从哪几个表中查 FROM 表名 别名 xxx JOIN 连接的表名 别名 on 交叉条件
操作 | 描述 |
---|---|
inner join | 如果表中至少有一个匹配,就返回行 |
left join | 会从左表中返回所有的值,即使右表中没有匹配 |
right join | 会从右表中返回所有的值,即使左表中没有匹配 |
自连接
自己的表与自己的表连接,核心:一张表拆成两张一样的表
9.5、分页与排序
-- 排序:升序 ASC , 降序 DESC
-- ORDER BY 通过哪个字段排序,怎么排
-- limit a , b a:起始值 b:页面大小
9.6、子查询
where (值是计算出来的)
本质:在where语句中嵌套一个子查询语句
9.7、MySAQL函数
常用函数
-- 数学运算
SELECT ABS(-8) -- 取绝对值
SELECT CEILING(9.4) -- 向上取整
SELECT SIGN(10) -- 判断一个数的符号
-- 字符串函数
SELECT CHAR_LENGTH('即使再小的反也能远航') -- 字符串长度
-- 时间与日期函数(记住)
SELECT CURRENT_DATE() -- 获取当前日期
SELECT CURDATE()
SELECT NOW()
聚合函数
10、事务
10.1、什么是事务?
要么都成功,要么都失败
-- mysql是默认开启事务自动提交的
SET autocommit = 0 -- 关闭
SET autocommit = 1 -- 开启(默认开启)
-- =====手动处理事务====
-- 事务开启
START TRANSACTION -- 标记一个事务的开始
INSERT XX
-- 提交:持久化
COMMIT
-- 回滚:回到原来的样子
ROLLBACK
-- 事务结束
SET autocommit = 1 -- 开启自动提交
-- 了解
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(6) NOT NULL,
`money` DECIMAL(9,2) NOT NULL,
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO `account`(`name`,`money`) VALUES ('A',1000.00),('B',9000.00)
-- 模拟转账:事务
-- 关闭自动提交
SET autocommit = 0
-- 开启一个事务
START TRANSACTION
UPDATE `account` SET `money`=`money`-500 WHERE `name`='A'
UPDATE `account` SET `money`=`money`+500 WHERE `name`='B'
COMMIT -- 提交事务,数据持久化
ROLLBACK -- 回滚
SET autocommit = 1 -- 回复自动提交
11、索引
MySQL官方对索引的定义为:索引是帮助MySQL高效获取数据的数据结构
11、1、索引的分类
- 主键索引:PRIMARY KEY
- 唯一的标识,主键不可重复,只有一个列作为主键
- 唯一索引:UNIQUE KEY
- 避免重复的列出现,唯一索引可以重复,多个列都可以标识为 唯一索引
- 常规索引:KEY
- 默认的,INDEX,KEY来设置
- 全文索引:FullText
-- 索引的使用
-- 1、在创建表的时候给字段增加索引
-- 2、创建完毕后,增加索引
-- 显示所有的索引信息
SHOW INDEX FROM student
-- 增加一个全文索引 (索引名) 列名
ALTER TABLE `student` ADD FULLTEXT INDEX `studentName`(`studentName`)
-- EXPLAIN 分析sql执行的状况
EXPLAIN SELECT * FROM student -- 非全文索引
11、2、索引的测试
-- 插入100万数据
11、3、索引原则
- 索引不是越多越好
- 不要对经常进行变动的数据加索引
- 小数据量的表不需要加索引
- 索引一般加在常用来查询的字段上
12、三大范式
第一范式
原子性:保证每一列不可再分
第二范式
前提:满足第一范式
每张表只描述一件事情
第三范式
前提:满足第一范式和第二范式
第三范式需要确保数据表中的每一列数据都与主键直接相关,而不能间接相关
13、JDBC
13.1、数据库驱动
驱动:声卡,显卡,数据库
13.2、第一个JDBC程序
public class FirstJDBCDemo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 1.加载驱动
Class.forName("com.mysql.cj.jdbc.driver");
// 2.用户信息
String url = "jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8&useSSL=true";
String username = "root";
String password = "password";
// 3.连接数据库,获得数据库对象
Connection connection = DriverManager.getConnection(url, username, password);
// 4.获得执行SQL的对象
Statement statement = connection.createStatement();
// 5.执行SQL,查看结果
String sql = "SELECT * FROM student";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()){
System.out.println(resultSet);
}
// 6.释放连接
resultSet.close();
statement.close();
connection.close();
}
}