数据库 - 基础4-记录

本文详细介绍了MySQL数据库的一些常见问题及解决方案,包括连接问题、基本查询语句、数据类型、权限管理、时间处理以及Navicat的使用等。还提到了MySQL5.7与8.0的差异和读写分离的概念。
摘要由CSDN通过智能技术生成

书籍学习
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 的数据库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_1403034144

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值