目录
书籍学习
https://www.zhihu.com/question/28385400/answer/2324578441
Mysql数据库 每天定点 自动弹出小黑 窗解决方案
参考于:
https://dandelioncloud.cn/article/details/1584421702576885761
https://blog.csdn.net/m0_73093747/article/details/127452317
Mysql Installer
can’t connect to mysql server on ‘localhost’ 10061
参考
https://blog.csdn.net/weixin_46013570/article/details/123893544
https://blog.51cto.com/u_16175491/8463026
D:\download\program\bibei\Mysql\mysql57\data\my.ini 中datadir参数:
datadir=D:/download/program/bibei/Mysql/mysql57/data/Data
数据库基本语句
连接串
jdbc: mariadb://xxxx:3306/bookmark?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&socketTimeout=1800000&serverTimezone=GMT%2B8
参数说明
https://blog.csdn.net/wpydaguan/article/details/41148047
useUnicode:是否使用Unicode字符集,如果参数characterEncoding设置为gb2312或gbk,本参数值必须设置为true
autoReconnect:当数据库连接异常中断时,是否自动重新连接
socketTimeout:socket操作(读写)超时,单位:毫秒。 0表示永不超时
解决相差8小时问题关于jdbc时区的配置:
serverTimezone=Asia/Shanghai 或 serverTimezone=GMT%2B8
驱动
com.mysql.cj.jdbc.Driver 和 org.mariadb.jdbc.Driver是Java中用于连接MySQL和MariaDB数据库的驱动程序。它们的区别主要体现在以下几个方面:
1.历史背景:com.mysql.cj.jdbc.Driver是MySQL Connector/J驱动程序的一部分,而org.mariadb.jdbc.Driver是MariaDB Connector/J驱动程序的一部分。MySQL和MariaDB是两个不同的数据库管理系统,尽管它们在很多方面非常相似,但在某些功能和语法上可能存在差异。
2.兼容性:com.mysql.cj.jdbc.Driver主要用于连接MySQL数据库,而org.mariadb.jdbc.Driver主要用于连接MariaDB数据库。虽然它们都可以用于连接对方的数据库,但在某些情况下可能会出现兼容性问题。因此,建议根据实际情况选择适合的驱动程序。
3.特性支持:由于MySQL和MariaDB在某些功能上存在差异,因此它们的驱动程序在特性支持方面可能会有所不同。例如,com.mysql.cj.jdbc.Driver支持MySQL 8.0的新特性,如JSON数据类型和窗口函数,而org.mariadb.jdbc.Driver可能不支持这些特性。
总的来说,com.mysql.cj.jdbc.Driver 和 org.mariadb.jdbc.Driver都是用于连接MySQL和MariaDB数据库的驱动程序,但它们在历史背景、兼容性和特性支持方面存在一些差异。根据实际需求选择适合的驱动程序是很重要的。
org.mariadb.jdbc.Driver是MariaDB JDBC驱动程序的类名。
JDBC驱动程序是用于连接Java应用程序和数据库的软件组件。
MariaDB JDBC驱动程序允许Java应用程序与MariaDB数据库进行通信,从而可以在Java应用程序中执行SQL查询、更新和删除等操作。
因此,org.mariadb.jdbc.Driver的作用是提供MariaDB JDBC驱动程序的类名,使Java应用程序能够使用MariaDB数据库。
启动
net start mysql
下图对应 net start mysql57
启动命令无效的办法:mysqld --install
登录
https://blog.csdn.net/icanlove/article/details/38385555
https://www.myfreax.com/how-to-show-databases-in-mysql/
mysql -u user -p = 命令使用MySQL root用户登录
进入mysql,没有使用-A参数, 当我们打开数据库,即use dbname,要预读数据库信息
使用-A参数时,不预读数据库信息
SHOW DATABASES; = SHOW SCHEMAS;
+--------------------+
| Database |
+--------------------+
| information_schema |
| opencart |
+--------------------+
2 rows in set (0.00 sec)
SHOW DATABASES LIKE 'open%'; open开头的数据库的列表
use 某数据库; 进入某数据库
show tables; 查看当前库下有哪些表
查看表下面那些列
show columns from city; = describe city;
Database changed
use 某数据库;
出现 Database changed
表示 已经进入该数据库了
mysql 中 signed 与 unsigned
https://blog.csdn.net/qq_45445841/article/details/104002092
数据类型
decimal 浮点数
https://www.cnblogs.com/Helloxxm/articles/11400923.html
查询数据库
show databases 显示所有的数据库
use xxx; 进入xx数据库
show tables; 显示数据表
查询
查看数据库中所有用户
SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
show grants for 'mysql.sys'@'localhost';
查询:id 对应的修改次数+ id 最近修改时间
SELECT Id,COUNT(Id) as `count`,
substring_index(group_concat(createTime order by createTime desc),',',1) as lastModifiedTime
FROM 表名 group by Id;
=
selectId,count(Id), MAX(CREATEtime) from 表名 group by Id;
查询账号权限
show grants;
查询账户
SELECT
user
FROM
mysql.user;
+------------+
| user |
+------------+
| rfc |
| superadmin |
| mysql.sys |
| root |
| super |
+------------+
5 rows in set (0.27 sec)
mysql> SELECT
user,
host,
account_locked,
password_expired
FROM
mysql.user;
+------------+-----------+----------------+------------------+
| user | host | account_locked | password_expired |
+------------+-----------+----------------+------------------+
| root | localhost | N | N |
| mysql.sys | localhost | Y | N |
| superadmin | % | N | N |
| super | localhost | N | N |
| rfc | % | N | N |
+------------+-----------+----------------+------------------+
https://www.yukx.com/bingningm/article/details/1794.html
Account_locked代表此用户被锁住,无法使用
Password_expired 设置成’Y’ = 允许DBA将此用户的密码设置成过期,而且过期后 要求用户的使用者重置密码(alter user/set password重置密码)
查找无主键表
https://blog.csdn.net/wangkun_j/article/details/118669480
-- 法1
SELECT
t1.table_schema,
t1.table_name
FROM
information_schema.TABLES t1
LEFT OUTER JOIN information_schema.TABLE_CONSTRAINTS t2 ON t1.table_schema = t2.TABLE_SCHEMA
AND t1.table_name = t2.TABLE_NAME
AND t2.CONSTRAINT_NAME IN ('PRIMARY')
WHERE
t2.table_name IS NULL
AND t1.table_type = 'BASE TABLE'
AND t1.TABLE_SCHEMA NOT IN (
'information_schema',
'performance_schema',
'mysql',
'sys'
);
-- 法2
SELECT
t1.table_schema,
t1.table_name
FROM
information_schema.TABLES t1
LEFT OUTER JOIN information_schema.TABLE_CONSTRAINTS t2 ON t1.table_schema = t2.TABLE_SCHEMA
AND t1.table_name = t2.TABLE_NAME
AND t2.CONSTRAINT_NAME IN ('PRIMARY')
WHERE
t2.table_name IS NULL
AND t1.table_type = 'BASE TABLE'
AND t1.TABLE_SCHEMA = '搜索的数据库名';
输出一个表的全部字段
SELECT column_name
FROM information_schema.COLUMNS
WHERE table_name = '表名';
行 ROWNUM
仅限Oracle:
-- 查询前10行记录
SELECT ROWNUM, t1.* FROM XXX t1 WHERE ROWNUM <= 10;
-- 查询从11行到20行的记录
SELECT * FROM XXX WHERE ROWNUM < 21 MINUS SELECT * FROM XXX WHERE ROWNUM < 11;
或者
SELECT * FROM (SELECT ROWNUM NO, t1.* FROM XXX t1) t2 WHERE t2.NO > 10 AND t2.NO < 21;
mysql行使用
SET @rownum = 0;
SELECT @rownum:=@rownum + 1 rownum FROM tpl_lookup_item_t;
text相关类型
https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000365144
blob:二进制形式的大量数据
TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。它们对应于四种 BLOB 类型
TINYTEXT 是最大长度为 256 个字符
TEXT 列的最大长度为 65,536 个字符
MEDIUMTEXT 是最大长度为 16,777,216 个字符
LONGTEXT 最大长度为 50331648 或 48 M 个字符的 TEXT 类型
limit
https://www.runoob.com/note/28032
select * : 返回所有记录
limit N : 返回 N 条记录
limit N,M : 相当于 limit M offset N , 从第 N 条记录开始, 返回 M 条记录
offset M : 跳过 M 条记录, 默认 M=0, 单独使用 不起作用
nextval
nextval返回下一个序列值,currval返回当前序列值。
nextval(n)返回n个唯一序列值
dual
Oracle 存在虚拟表: dual
https://blog.csdn.net/accessin2008/article/details/5684021
MySQL中使用select 1;
不加 from table就可以执行
Oracle中需要满足select * from table;
这样的结构
一张表转移数据到另一张表
法1: - sql:
https://blog.csdn.net/jiuzaizuotian2014/article/details/114919828
(1)两张表结构完全一样
INSERT INTO TargetTableName SELECT * FROM SourceTableName;
(2)两张表结果不完全一样
INSERT INTO TargetTableName (`taget-table-col1`, `taget-table-col2`, ...)
SELECT `source-table-col1`, `source-table-col2`, ... FROM 来源表;
INSERT INTO TargetTableName (a,b,c)
SELECT a,b,"asd" FROM 来源表;
MySQL字段大小写是否敏感
https://www.jianshu.com/p/f2eabcef6577
show global variables like '%lower_case%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_file_system | ON |
| lower_case_table_names | 0 |
+------------------------+-------+
lower_case_file_system,代表当前系统文件是否大小写敏感,只读参数,无法修改。ON 大小写不敏感,OFF 大小写敏感
lower_case_table_names,代表表名是否大小写敏感,可以修改,参数有0、1、2三种。
0 大小写敏感。(Unix,Linux默认) 创建的库表将原样保存在磁盘上。如create database TeSt;将会创建一个TeSt的目录,create table AbCCC …将会原样生成AbCCC.frm文件,SQL语句也会原样解析。
1 大小写不敏感。(Windows默认) 创建的库表时,MySQL将所有的库表名转换成小写存储在磁盘上。 SQL语句同样会将库表名转换成小写。 如需要查询以前创建的Testtable(生成Testtable.frm文件),即便执行select * from Testtable,也会被转换成select * from testtable,致使报错表不存在。
2 大小写不敏感(OS X默认) 创建的库表将原样保存在磁盘上, 但SQL语句将库表名转换成小写。
改密码
flush privileges;
https://www.imooc.com/wenda/detail/601260
flush privileges:将当前 user 和 privilige 表中的用户信息/权限设置从 mysql 库 (MySQL数据库的内置库) 提取到内存里。
MySQL用户数据和权限出现修改后,在"不重启MySQL服务"的情况下直接生效,就需要执行这个命令。修改某个帐号的设置后,避免重启,那么 flush privileges 之后就可以使权限设置生效
1、用户root用户进入mysql再打开mysql数据库(use mysql)后。
create user stu identified by ‘stu’; ##创建一用户stu并添加密码为stu。
exit; ##退出测试。
2、用新用户重新进入mysql。
mysql -ustu -pstu ##进入成功。
3、重新使用root用户进入mysql并打开mysql数据库。
update user set password=password(‘123456’) where user='stu'; ##更改stu用户密码为123456。
exit; ##再次退出测试。
4、直接以用户stu身份进入,用新密码进入看是否成功。
mysql -ustu -p123456; ##报错,密码不正确。
5、重新以root 用户登陆并进入mysql数据库,重新修改用户密码。
update user set password=password (‘123456’) where user='123456'; ##更改stu用户密码为123456
flush privileges; ##刷新MySQL的系统权限相关表。
exit;
6.再次退出,并以stu用户123456密码进入,测试成功。
时间
时间函数 now()
`xxx_DATE` timestamp not null default current_timestamp on update current_timestamp
DEFAULT CURRENT_TIMESTAMP
表示当插入数据的时候,该字段默认值为当前时间
ON UPDATE CURRENT_TIMESTAMP:字段无论值有没有变化,它的值也会跟着更新为当前UPDATE操作时的时间
CURRENT_TIMESTAMP
https://www.cnblogs.com/reded/p/11972392.html
case when
https://www.yuque.com/sharingme/bhgnap/en0q1c
https://blog.csdn.net/helloxiaozhe/article/details/78124138
select age,first_name,
case country
when 'USA' then 'North America'
when 'UK' then 'Europe'
else 'other' end as continent
from Customers
case语句计算国家列的值,如果值等于“USA”,它将返回“North America”
如果等于“UK”,则返回“Europe”,如果是其他国家,则返回“other”。
注意
where条件里不要对 时间字段上使用时间函数
navicat
修改 每页只显示1000条数据
Navicat行数和表实际行数不一致
https://minsonlee.github.io/2021/06/what-is-difference-with-table-rows-and-count-table
TABLE_ROWS:
The number of rows. Some storage engines, such as MyISAM, store the exact count. For other storage engines, such as InnoDB, this value is an approximation, and may vary from the actual value by as much as 40% to 50%. In such cases, use SELECT COUNT(*) to obtain an accurate count.
行的数量。一些存储引擎,比如 MyISAM,存储的是精确的计数。
对于其他的存储引擎,比如 InnoDB,这个值是一个近似值,可能与实际值相差 40% - 50%
在这种情况下,SELECT COUNT(*) 来获得一个准确的计数。
navicat查看MySQL数据库、表容量大小
https://blog.csdn.net/haibo0668/article/details/105446200
select
table_schema as '数据库',
sum(table_rows) as '记录数',
sum(truncate(data_length/1024/1024, 2)) as '数据容量(MB)',
sum(truncate(index_length/1024/1024, 2)) as '索引容量(MB)'
from information_schema.tables
group by table_schema
order by sum(data_length) desc, sum(index_length) desc;
mysql 5.7 VS 8.0
https://www.jianshu.com/p/bc13c572c517
https://juejin.cn/post/7111255789876019208
MySQL 8 改进了 JSON
抽取数据的 JSON_EXTRACT() 函数
将数据组合到 JSON 数组中的 JSON_ARRAYAGG() 函数
将数据组合到 JSON 对象中的 JSON_OBJECTAGG() 聚合函数
utf8mb4 作为 MySQL 的默认字符集
mysql 8 开始允许限制重复使用以前的密码
索引增强:隐藏索引、降序索引、函数索引
通用表达式(CTE)
with recursive cte(idx) as
(
select 1
UNION
select idx+1 from cte where idx<10
)
select * from cte;
MySQL 8 要比 MySQL 5.7 快 2 倍
性能提升主要集中在3个领域:
读写
I/O密集型工作负载
热点竞争问题工作负载
schema
schema是数据库对象的集合,
包含了各种对象,如 表、视图、存储过程、索引
如果把database看作是一个仓库,仓库很多房间(schema),一个schema代表一个房间,table可以看作是每个房间中的储物柜,user是每个schema的主人,有操作数据库中每个房间的权利,就是说每个数据库映射user有每个schema(房间)的钥匙
读写分离 主库备库
主库备库:这是两个完全一样的数据库,平时主库在用,主库出问题,备库切上去(容灾)
同步是秒级
读写分离:这是两个完全一样的数据库,平时都在用,
写操作用可写
的数据库,读操作用只读
数据库
同步也是秒级
使用操作:
配置只读和可写的两个数据库连接串
application.yml:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
# 只读数据库链接
url: jdbc:mysql://xxxx1:3306/student?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
username: root
password: ENC(123456789)
# 可写数据库链接
url: jdbc:mysql://xxxx2:3306/student?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
username: root
password: ENC(123456789)
jasypt:
encryptor:
password: sad124f1f1rf1fgt5
property:
prefix: ENC(
suffix: )
config.xml两个数据库配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置MyBatis运⾏行行环境 -->
<environments default="development">
<environment id="development">
<!-- 配置JDBC事务管理理 -->
<transactionManager type="JDBC"></transactionManager>
<!-- POOLED配置JDBC数据源连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${driver-class-name}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${username}"></property>
<property name="password" value="${password}"></property>
</dataSource>
</environment>
</environments>
</configuration>
-----------------------
application.yml文件:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
# test
url: jdbc:mysql://xxxxxxx:3306/bookmarksdb?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
username: dbAdmin
password: ENC(ato8fgnU10F****bFEL0ZIK18TJF)
server:
port: 8094
jasypt:
encryptor:
password: sad124f1f1rf1fgt5
property:
prefix: ENC(
suffix: )
<environment id="a">
可以有多个,即多个数据库
在上面 <environments default="a">
指定 a 的数据库