文章目录
学习mysql时记的笔记,还是比较基础的
常识
安装目录:C:\Program Files\MySQL\MySQL Server 8.0
数据目录:C:\ProgramData\MySQL\MySQL Server 8.0\Data
my.ini位置:C:\ProgramData\MySQL\MySQL Server 8.0
端口3306
在cmd services.msc打开服务窗口
在cmd(管理员)启动:net start mysql80 停止:net stop mysql80
管理员mysql登入: mysql -uroot -plixiang1997/mysql -uroot -p再输密码
mysql -h(IP地址) -u账号 -p密码 :连接别人的mysql
mysql --h=(IP地址) --user=账号 --password=密码 :连接别人的mysql
退出:exit、quit
SQL不区分大小写(windows的mysql不区分大小写,但是linux区分
)
注释:-- 内容 或者 #内容 或者 /* 内容*/
DDL:操作数据库和表
操作数据库:CRUD
Create 创建
只创建: create database 数据库名
创建时判断存在(字符集默认utf8): create database if not exists 数据库名 ;
创建时设置字符集: create database 数据库名 character set 字符集名 ;
创建时判断存在并设置字符集: create database if not exists 数据库名 character set 字符集名;
Retrieve 查询
show databases;:查所有数据库名称
show create database 数据库名;:查指定数据库的字符集/查创建语句
Updata 修改
修改数据库字符集名:alter database 数据库名 character set 字符集名;
Delete 删除
删除数据库:drop database 数据库名;
删除数据库(存在时删):drop database if exists 数据库名;
使用数据库
查询当前正在使用的数据库名:select database();
使用数据库:use 数据库名;
操作表:
Create 创建
创建表:create table 表名(
列名1 数据类型1,
列名2 数据类型2,
列名3 数据类型3,
列名4 数据类型4,
......
列名n 数据类型n
);
数据类型:int:age int,
double:score double(总共位数,小数点后位数),
日期date:yyyy-MM-dd
日期包含时分秒datetime:yyyy-MM-dd HH:mm:ss
日期不赋值默认系统时间timestamp:yyyy-MM-dd HH:mm:ss
字符串varchar:name varchar(字符最大长度),
例:
create table student(
id int,
name varchar(32),
age int,
score double(4,1),
birthday date,
insert_time timestamp
);
复制表(判断新名重复):create table if not exists 新表名 like 旧表名;
Retrieve 查询
查询表名:show tables;
查询表结构:desc 表名;
Updata 修改
修改表名:alter table 表名 rename to 新表名;
修改表的字符集:alter table 表名 character set 字符集名;
添加字段:alter table 表名 add 列名 数据类型;
修改列名称 类型
改字段名和数据类型:alter table stu change 旧字段 新字段 新数据类型;
只改数据类型:alter table 表名 modify 字段名 新数据类型;
删除列:alter table 表名 drop 列名;
Delete 删除
删除表名:drop table 表名;
删除表名(在存在时删):drop table if exists 表名;
DML:增删改表数据
添加数据
insert into 表名(字段名1,字段名2,字段名3....) values(值1,值2,值3......);
字段名和值要一一对应;如果表名后不定义列名则给所以添加值;除了数字类型,其他要引号或者双引号;
一次性插入多行:INSERT INTO 表名 VALUES(记录一),(记录二),(记录三);
删除数据
删除一定条件的数据:delete from 表名 where 条件; 如不加条件,则删除所有;
删除多表数据,注意别名前后要统一:delete a,b from 表1 a,表2 b where 条件;
清空表:truncate table stu; 原理:删除表,再创建一个和原来一样的表
修改数据
修改单表数据:UPDATE 表名 SET 字段1=新值,字段2=新值,...,字段n=新值 WHERE 寻找条件;
修改多表数据(多用于数据相关的表的更新):update 表1 a,表2 b set a或b.字段1=新值,a或b.字段2=新值,...,a或b.字段n=新值 where 条件
DQL:查表数据
查询表中的记录
查所有:select*from 表名;
查所选字段:SELECT 字段1,字段2 FROM stu;
查不重复字段distinct:SELECT DISTINCT 字段1,字段2 FROM stu;
条件查询where:SELECT*FROM 表名 WHERE 条件;
排序order by:desc降序,asc升序,默认升序 先按字段1排,遇到值相同再按字段2排,如无字段2则乱序排
SELECT*FROM 表名 ORDER BY 字段1 顺序,字段2 顺序;
中文排序的处理: 对应中文字段使用GBK编码 convert(字段名 using gbk)
SELECT*FROM 表名 ORDER BY convert(字段1 using gbk) 顺序 ;
聚合:将一列作为一个整体做计算,排除null值
count:计算个数 select count(字段名) from 表名;
max,min:最值 select max(字段名) from 表名;
sum:和 select sum(字段名) from 表名;
avg:平均值 select avg(字段名) from 表名;
分组group by: where是分组前条件,having是分组后条件:
select 分组字段,聚合函数 from 表名 where 条件 group by 分组字段/聚合函数 having 条件;
注意:
1. 分组之后查询的字段:分组字段、聚合函数
2. where 和 having 的区别?
1. where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
2. where 后不可以跟聚合函数,having可以进行聚合函数的判断。
运算符:between ..and.. ; in(集合); is null;
模糊查询like:_单个任意字符;%多个任意字符; select*from 表名 where 字段名 like '条件% ';
方言,mysql独有:
分页limit:select 条件 from 表名 limit 开始位置,查询条数;
公式:开始位置=(页码-1)*查询条数
DCL(授权,管理用户)
管理用户:
添加用户
create user '用户名'@'主机名' identified by '密码';
删除用户
drop user '用户名'@'主机名';
修改用户密码
-- mysql8已经废除了password函数 update user set password=password('新密码') where user='用户名';
SET PASSWORD FOR '2867435738'@'localhost'=PASSWORD('lixiang');
可用:ALTER USER '用户名'@'主机名' IDENTIFIED BY '新密码';
查询用户:%表示可以在任意主机登入数据库
USE mysql;
SELECT*FROM USER;
权限管理:
1. 查询权限:
-- 查询权限
SHOW GRANTS FOR '用户名'@'主机名';
SHOW GRANTS FOR 'lisi'@'%';
2. 授予权限:
-- 授予权限
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
-- 给张三用户授予所有权限,在任意数据库任意表上
GRANT ALL ON *.* TO 'zhangsan'@'localhost';
3. 撤销权限:
-- 撤销权限:
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
REVOKE UPDATE ON db3.`account` FROM 'lisi'@'%';
约束:对表中的数据进行限制,保证数据正确有效完整。
主键约束:primary key非空且唯一,一张表只能有一个
创建表时添加:字段名 数据类型 primary key,
删除主键约束:ALTER TABLE 表 drop primary key;
添加主键约束:ALTER TABLE 表 MODIFY 字段名 数据类型;
非空约束:not null
创建表时添加:字段名 数据类型 not null,
设置非空约束:ALTER TABLE 表 MODIFY 字段名 数据类型;
唯一约束:unique不能重复,但可以为空
创建表时添加:字段名 数据类型 unique,
删除唯一约束:ALTER TABLE 表 drop index 字段名;
添加唯一约束:ALTER TABLE 表 MODIFY 字段名 数据类型;
外键约束:foreign key,让多个表的数据产生依赖关系从而保证表中数据的正确性,外键可以为null,但不能为不存在的外键名
在创建表时添加外键:constraint 外键名称 foreign key (外键列名称,本表)references 关联表名称(关联表字段);
删除外键:ALTER TABLE 表 drop foreign key 当时起的外键名称;
添加外键:table 表 add constraint 外键名称 foreign key (外键列名称,本表)references 关联表名称(关联表字段);
级联操作:on update cascade/on delete cascade在添加外键时设置级联更新与级联删除实现操作外键表能同时改变关联表(架构设计器)
创建表时添加:constraint 外键名称 foreign key (外键列名称,本表)references 关联表名称(关联表字段) on update cascade on delete cascade;
添加外键级联:table 表 add constraint 外键名称 foreign key (外键列名称,本表)references 关联表名称(关联表字段) on update cascade on delete cascade;
自动增长:auto_increment 一般配合int型主键使用,添加数据时可手动设置数值,自动增长只和上一条数据相关
创建表时添加:字段名 数据类型 primary key auto_increment ,
设置自动增长:ALTER TABLE 表 MODIFY 字段名 数据类型;
创建索引: index 主键约束会自动创建索引,当数据经常被查询时需要为该字段创建索引,索引会额外消耗存储空间以及增删改压力
表外: create index idx_索引名 on 表名(字段名);
表内: index idx_索引名(字段名)
数据库设计
多表之间关系:1:1; 1:N; M:N;
实现1:1
在任意一方添加唯一外键(unique),指向另一方主键。也可以让主键相同
实现1:n
在多的一方建立外键,指向一的一方的主键
实现m:n
多对多关系实现,需要借助中间表,中间表至少包含两个字段(联合主键),这两个字段作为外键,分别指向两张表的主键
数据库设计范式:规范递增,要遵循后面的范式必须遵循前面的范式
第一范式1nf
每个字段都不可分割:会存在数据冗余,数据添加删除存在问题
第二范式2nf拆表:在1的基础上,非码属性必须完全依赖于码
函数依赖:通过a(组)确定b
完全函数依赖:通过a组的所有值确定b
部分函数依赖:通过a组的部分值确定b
传递函数依赖:通过a(组)确定b,通过b确定c
码:一个属性(组),被其他所有属性完全依赖则这个属性为该表的码
第三范式3nf再拆表:消除传递依赖
数据库备份与还原
命令行
备份:mysqldump -u用户名 -p密码 数据库名 > 保存的路径
还原:
1.登入数据库
2.创建数据库
3.使用数据库
4.执行文件,soures 文件路径
图形化工具
有备份选项,保存到选好的位置;
还原是选执行sql脚本,执行保存的sql语句
多表查询
select*from 表1,表2; -- 结果为两个表做笛卡尔积
多表查询的意义:消除无用的笛卡尔积:
分类:
内连接查询
隐式内连接 select 查找内容 from 表1,表2 where 条件;
显示内连接 select 字段列表 from 表1 inner(可省) join 表2 on 条件;
外连接查询
左外连接:查左表所有记录和交集 select 字段列表 from 表1 left outer(可省) join 表2 on 条件;
右外连接:查右表所有记录和交集 select 字段列表 from 表1 right outer(可省) join 表2 on 条件;
子查询
子查询结果单行单列 select 条件 from 表 where 字段=(条件由新select产生);
子查询结果多行单列 select 条件 from 表 where 字段=IN(范围由新select产生);
子查询结果多行多列 select 条件 from 表1 别名,(select语句查出来的表) 别名 where 条件;
事务:一个包含多个步骤的业务操作,被事务管理,那么操作要么同时成功,要么同时失败
开启事务 start transaction;
回滚 roolback;
提交 commit;
自动提交:一条(增删改)语句会自动提交事务。
mysql数据库事务默认自动提交
手动提交:需要先开启事务,再提交
oracle数据库默认手动提交
修改事务的提交方式:
查看:select @@autocommit; 1代表自动提交,0代表手动提交
修改:set @@autocommit=0;
事务的四大特征:
原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败
持久性:当事务提交或回滚后,数据库会持久化的保存数据
隔离性:多个事务之间,相互独立
一致性:事务操作前后,数据总量不变
事物的隔离级别:多个事务之间隔离的,相互独立的。但如果多个事务操作同一批数据,则会引发一些问题,需要设置不同的隔离级别来解决这些问题
问题:
脏读:一个事务,读到另一个事务中没有提交的数据
不可重复读(虚读):在同一个事务中,两次读到的数据不一样
幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。
隔离级别:隔离级别从小到大安全性增高,效率降低
读未提交read uncommitted 产生问题:脏读,不可重复读,幻读
读已提交read committed (oracle默认) 产生问题:不可重复度,幻读
可重复读repeatable read (mysql默认) 产生问题:幻读
串行化serializable 产生问题:无 方式参考多线程加锁
查询隔离级别:select @@tx_isolation;
设置隔离级别:set global transaction isolation level 级别字符串; 要关数据库重新打开才会生效。
时间函数
now()
当前时间
year(时间)
表示截取括号中时间为年的部分
最基础的JDBC操作(我是看了又忘)
我idea的数据库插件需要设置时区 Asia/Shanghai,不然连不上mysql
//1.导入jar包 设置 Asia/Shanghai
//2.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//3.获取数据库连接对象
Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/db1?&useSSL=false&serverTimezone=Asia/Shanghai","root","lixiang1997");
//4.定义sql语句
String sql="update stu set score=88.1 where id=3";
//5.获取执行sql的对象
Statement stmt=conn.createStatement();
//6.执行sql
int count=stmt.executeUpdate(sql);
//7.处理结果
System.out.println(count);
//8.释放资源
stmt.close();
conn.close();
我目前用的数据库基本配置
注意: driverClassName=com.mysql.cj.jdbc.Driver
mysql8.0驱动类的位置变化了,要写上面的驱动位置,不过这个也可以省略,大部分框架都会自动识别驱动
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/management?useUnicode=true&characterEncoding=utf8& zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=lixiang1997
jdbc.initialSize=5
jdbc.maxActive=10
jdbc.maxWait=3000
jdbc.validationQuery=select 1
用SQLyog访问云端linux上的mysql
注意: 要将登入账号的访问权限由localhost改为%