命令行下,Mysql、Postgre、DB2 的一些基本操作

目录

■mysql

・自己的MySQL用户

・MySQL配置文件

・MySQL导出数据文件

・MySQL导入数据文件

・MySQL中,大小写区分

・MySQL中的索引(index)

・使用Union all 还是 in 快

・查看索引

・in是否使用索引

・MySQL中的引擎(engine)

InnoDB

MyISAM

两者之间的区别

1.启动服务 (进入bin目录)  // 启动是 「mysqld」  连接是 「mysql」

   1.1.确认服务是启动状态

2.连接DB // 启动是 「mysqld」  连接是 「mysql」

3.连接并执行SQL

4.1.查看登录用户

4.2.查看主机信息

5.常用命令(コマンド)

6.查看存储过程

7.查看触发器

8.导入csv文件

8.1.mysql数据库中blob数据导出为文件

9.伪表 DUAL

10.查看 前10件

11.查看表的跟新时间

12.erorlog

13.查看数据库中的用户

14.查看用户权限

15.创建用户・授权

16.刷新权限

17.访问权限控制

18.查看编码

19.可登录,却无法使用问题

20.mysql-client的使用

●安装

●安装之后的效果

21.添加mysql用户

22.跨主机直接的连接

●从Linux,连接本地电脑(192.168.52.1)中的mysql 

●Linux侧,端口占用、进程的显示

●Linux侧,通过脚本停止mysql时,可以参考的命令

●本地电脑的IP (192.168.52.1)

23.Audit

24.bin log

25.存储过程

26.Mysql的事务隔离级别 4种

幻读(幻像读)

★★★ 【事务隔离级别】 与 【死锁】   ★★★ 

在数据库事务隔离级别中,Read committed和Repeatable read,哪一种更容易产生死锁

事务中的 select 语句,会对记录加锁吗

mysql的 Repeatable Read 事务隔离级别,事务中的 select 语句,会对查询的记录加锁吗

26.Mysql中的各种函数

・DATEDIFF() 函数返回两个日期之间的天数。

・date_sub(d, INTERVAL expr type)

・now()

・substring_index()  // 截取到第几个

・current_timestamp()

27.Mysql中的一些特性

  ・删除表,这个表对应的触发器也会被删除

  ・使用存储过程插入数据时,不会触发「触发器」 

28.UNION  与 UNION ALL

29.explain 执行计划 (実行計画)

30.索引

创建索引

 查看索引

31.mysql导出Insert语句

32.mediumblob  // mysql 字段   blob数据类型

33.order by 默认排序 (升序)

34.Mysql中的  日期数据类型

35. mysql中的 【\G】

36. mysql修改密码

37.mysqsl  +  springboot + dbunit  出现  【AmbiguousTableNameException】解决

38.springboot启动,加载数据库定义文件源码分析 :为什么会加载 【schema-all.sql】这个文件

・DataSourceInitializer  #  getScripts

・DataSourceInitializer  #  createSchema  #  initSchema

・DataSourceProperties

39.JSON_OBJECT

40.XXX

41.XXX

42.XXX

■Postgre

■MySql中 delimiter

■Oracle

■DB2

1.启动命令,存储过程

2.用語

3.DB2函数大全

4.DB2常用函数持续汇总

5.DB2报错整理

6.DB2 JSON

7.XXX

8.XXX


===

■mysql

・自己的MySQL用户

   ・Windows

     自己的mySql用户_sun0322-CSDN博客

  ・Linux

     Linux中,Mysql安装_sun0322-CSDN博客

・MySQL配置文件

Mysql配置_sun0322-CSDN博客

・MySQL导出数据文件

Mysql导出数据 (windows Linux)_sun0322-CSDN博客

・MySQL导入数据文件

使用mysql导入数据_sun0322-CSDN博客

・MySQL中,大小写区分

Mysql数据库中,大小写区分_sun0322-CSDN博客

・MySQL中的索引(index)

・使用Union all 还是 in 快

mysql 实战 or、in与union all 的查询效率_freedom3959的博客-CSDN博客

对于索引列来最好使用union all,因复杂的查询【包含运算等】将使or、in放弃索引而全表扫描,除非你能确定or、in会使用索引。
对于只有非索引字段来说你就老老实实的用or 或者in,因为 非索引字段本来要全表扫描而union all 只成倍增加表扫描的次数。

・查看索引

show index from YourTableName

Table
。。。
Key_name : 索引的名字
。。。
Column_name: 引的名字
。。。
Index_comment

・in是否使用索引

关于MySQL中使用IN 是否会走索引的探寻_m0_37843652的博客-CSDN博客_mysql in 是否使用索引

in 走不走索引由mysql 优化执行器(那是相当的复杂)去判断,它觉得走索引快就走,不走索引更快就不走。

(使用 explain  select XXXX  来判断)

SQL中,如果使用外连接,查询多个表,每个表会有【一自己对应的记录

下面是【列】的信息

id
table:显示SQL中表的别名
。。。
key:表示实际使用的索引(可以是多个)  (注意:这里显示的是索引的名字,不是索引列的列名)
。。。
Extra

・MySQL中的引擎(engine)

InnoDB

InnoDB,是MySQL的数据库引擎之一,现为MySQL的默认存储引擎,为MySQL AB发布binary的标准之一。
(InnoDB由Innobase Oy公司所开发,2006年五月时由甲骨文公司并购。)

CREATE TABLE `user` (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户表id',
 `username` varchar(50) NOT NULL COMMENT '用户名',
  。。。。
 PRIMARY KEY (`id`),
 UNIQUE KEY `user_name_unique` (`username`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8;

MyISAM

另外一个引擎 MyISAM
(MySQL Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写)

两者之间的区别

MyISAM不支持事务,而InnoDB支持。

=======================================

1.启动服务 (进入bin目录)  // 启动是 「mysqld」  连接是 「mysql」

mysqld --console
mysqld是服务,
linux系统里的服务,一般都是以d结尾的,
比如httpd、vsftpd、sshd等,d是daemon的缩写,
也就是守护进程,常驻后台

其他守护进程,比如 sshd

初次安装Linux(Ubuntu)(ssh,ftp服务安装)_sun0322-CSDN博客

   1.1.确认服务是启动状态

ps -e | grep mysql
// 不能使用 ps -ef

服务没有启动,连接时,出如下错误

ERROR 2002 Can‘t connect to local MySQL server  XXXX mysql.sock

2.连接DB // 启动是 「mysqld」  连接是 「mysql」

mysql -u userName -D databaseName -p   //连接时指定DB(Schema)

mysql -u root -p    //连接时不指定DB(Schema)

输入密码

mysql -u root // 连接时,无需输入密码
mysql -uroot // 连接时,无需输入密码

■更加快捷的方式
mysql -u userName -D databaseName -pYourPassword
// p的后面不能有空格

■连接其他服务器中的数据库
mysql -u userName -D databaseName -pYourPassword -h192.168.1.122

■查看连接的用户
select user();
---
userName@192.168.1.122

3.连接并执行SQL

mysql -u userName -D databaseName -p < /home/ddd/XXXX.sql > /home/ddd/XXXX_result.txt;

输入密码

4.1.查看登录用户

select user();

4.2.查看主机信息

show variables like '%hostname%';

5.常用命令(コマンド)

show databases;

use databaseName;

show tables;

DESC tableName;

show create view viewName;

show create table tableName;

6.查看存储过程

select db,name from mysql.proc where type= 'PROCEDURE';

---

select name from mysql.proc where db = 'your_db_name' and type= 'PROCEDURE';

use your_db_name; // 重要!!! 需要先切换DB(Schema)

show create procedure proc_name;
show create function func_name;

7.查看触发器

use your_db_name; // 重要!!! a.需要先切换DB(Schema)
          // b.与登录的用户也有关系,用户权限不足时,也有看不到trigger的可能
                  // c.使用mysql的root用户,可以看到

show triggers; // 只能查看,当前DB(Schema)对应的,trigger


■user 例子 不同用户连接同一个DB(Schema)对
mysql -u user001 -D mydb001 -p   // 看不到
mysql -u user002 -D mydb001 -p   // 看不到
mysql -u root -D mydb001 -p      // 能看到

↑ ※ 创建者(Definer)(创建trigger的用户)需要是root权限 !!!

  root@localhost

----

・查看含有某些关键字的Trigger 

show triggers where statement like '%KEY_WORD%';

   (比如存储过程的关键字,Trigger调用存储过程)
   (Trigger时属于数据库的,要先切换DB use XXX)


・查看trigger 一览

SELECT trigger_schema,trigger_name FROM information_schema.triggers;

(一览显示效果,比show trigger 效果更好)
 

8.导入csv文件

Mysql导入csv文件 - 夕月一弯 - 博客园

指定csv文件所在的目录

・--secure-file-pri option so it cannot execute

・查看有执行文件权限的目录

方法一:

show variables like ‘%secure%’;
输出默认值path

方法二:

my.ini
secure-file-priv="XXXX_____PATH"

8.1.mysql数据库中blob数据导出为文件

select image from t_image where id=1001 into dumpfile '/var/lib/mysql-files/1001.png'

/var/lib/mysql/file/  是 下面查询执行之后得到的值

show variables like '%secure%';
show variables like '%secure_file_priv%'; 

sxz001@sxzap01:~$ mysql -uroot -proot123
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.32 MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
mysql> show variables like '%secure%';
+--------------------------+-----------------------+
| Variable_name            | Value                 |
+--------------------------+-----------------------+
| require_secure_transport | OFF                   |
| secure_auth              | ON                    |
| secure_file_priv         | /var/lib/mysql-files/ |
+--------------------------+-----------------------+
3 rows in set (0.06 sec)

mysql>

前提:

参数:【secure_file_priv】已经配置好了

这个参数用来限制数据导入和导出操作的效果,例如执行LOAD DATA、SELECT … INTO OUTFILE语句和LOAD_FILE()函数。这些操作需要用户具有FILE权限。 如果这个参数没有设置,这个变量没有效果。
如果这个参数设为一个目录名,MySQL服务只允许在这个目录中执行文件的导入和导出操作。这个目录必须存在,MySQL服务不会创建它;

如果这个参数为NULL,MySQL服务会禁止导入和导出操作。

默认值 ( 在 /etc/my.cnf  文件中,找不到  secure 属性配置的原因,因为使用了默认值 )

默认的路径是/var/lib/mysql-files。

如果要想修改此路径的话,只能通过修改启动时添加特定参数或者修改配置文件后重启服务来实现。

===

9.伪表 DUAL

select now()-interval'22'day from DUAL

// 显示当前日期 - 22 日,后的日期信息

10.查看 前10件

select * from tableName limit 10

11.查看表的跟新时间

select * from information_schema.tables where table_schema='dababaseName' and table_name='tableName';

CREATE_TIME;UPDATE_TIME

12.erorlog

   my.cnf | grep log-error

    配置文件中,不设定的时候,主机名.err

windows中, 此log文件在 data目录下面  Program Files\mysql-5.7.22-winx64\data\主机名.err

13.查看数据库中的用户

select user, host  from mysql.user;

■経緯 

 ・host 值为 localhost

 ・host 值为 127.0.0.1 // 没有配置

 ・host 值为   本机器对应的 IP 地址 192.168.31.6

■现象

    此时,如果,代码配置文件中

     url: jdbc:mysql://localhost:3306/mydatabase

  username: user001

    便会无法连接数据库

■原因

    代码和数据库都在一台机器上,会去寻找【 127.0.0.1】对应的用户,不是寻找localhost

■解决

    url: jdbc:mysql://serverName:3306/mydatabase

14.查看用户权限

show grants for username@'localhost';

15.创建用户・授权

# 前提 使用root用户登录
mysql -u root -p 

# 创建数据库
create database db_example;
# 创建用户 (用户名@连接ip  by 密码)
create user 'springuser'@'localhost' identified by 'password'
// create user 'springuser'@'%' identified by 'password'
# 授权
// grant all on db_example.* to 'springuser'@'localhost';
grant select on db_example.* to 'springuser'@'localhost';

ーーー


■MySQL用户的host属性 (mysql.user.host)

当你远程登录MySQL时,使用的账号要有特殊要求。
 默认的账号的host属性都是localhost,
 意思是这个账号只能本地使用,

 如果要使用某个账号来远程登录,
 必须将账号的host属性值更改成%。

16.刷新权限

FLUSH PRIVILEGES:

17.访问权限控制

=====================

MySQL无法远程连接解决方案 - dai.sp - 博客园

查看/etc/mysql/my.cnf配置文件是否只允许本地连接
  注释配置:#bind-address = 127.0.0.1,重启MySQL Server

↑ 如果限制本地访问,远程访问时 error code 10061

・访问权限控制相关1---查看端口的开放情况

netstat  -ntulp | grep 端口号

・访问权限控制相关2---查看防火墙

firewall-cmd --query-port=3306/tcp
前提
防火墙启动
ps -e | grep firewalld

=====================

18.查看编码

show variables like '%char%';
一篇文章看懂mysql中varchar能存多少汉字、数字,以及varchar(100)和varchar(10)的区别 - 那些年的代码 - 博客园

4.0版本以下,varchar(100),指的是100字节,
如果存放UTF8汉字时,只能存33个(每个汉字3字节)

5.0版本以上,varchar(100),指的是100字符,
无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放100个

19.可登录,却无法使用问题

【mysql】You must reset your password using ALTER USER statement before executing this statement报错处理_muziljx的博客-CSDN博客

mysql> show databases;

ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

---

MySQL mysql -u root -p
SET PASSWORD = PASSWORD('新密码');
ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;
FLUSH PRIVILEGES;
quit

--

mysql.user
password_expired功能,它允许设置用户的过期时间。

select user,host,password_expired from mysql.user;

20.mysql-client的使用

// 使用下面命令查看帮助
mysql --help
// 查看版本
mysql --hlep | grep Distrib

mysqlclient安装 - 远山渡月 - 博客园

mysql client命令行选项 _jxzhfei的博客-CSDN博客  // 命令行

MySQL安装的三种方式 - 此时 - 博客园   // 下载 安装

mysql配置文件/etc/my.cnf之选项组[client]与[group]之间都有socket选项,其区别分析_河北强商网络科技有限公司官方博客-CSDN博客  // 配置文件

●安装

sudo apt install mysql-client-core-5.7

●安装之后的效果

21.添加mysql用户

MySQL mysql -u root -p
SET PASSWORD = PASSWORD('新密码');
ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;
FLUSH PRIVILEGES;
quit

22.跨主机直接的连接

●从Linux,连接本地电脑(192.168.52.1)中的mysql 

mysql -utest001 -ptest001 -h192.168.52.1

---

●Linux侧,端口占用、进程的显示

※ 这里的mysql进程,是mysql的客户端。 不是数据库进程/ // 数据库进程是 mysqld

●Linux侧,通过脚本停止mysql时,可以参考的命令

 ps aux | grep mysql | grep -v grep | awk ‘{print "kill -9" ,$2}’ | sh

---

●本地电脑的IP (192.168.52.1)

本地电脑与虚拟机连接时,使用WMware NetWork Adapter VMnet1

---

23.Audit

Percona Audit Log Plugin(mysql 审计)-WWQWQW-51CTO博客

审核日志插件随Percona Server一起提供,但默认情况下不会安装。
要启用该插件,您必须运行以下命令
INSTALL PLUGIN audit_log SONAME 'audit_log.so';
验证插件是否安装成功
SHOW PLUGINS;

---

SET GLOBAL audit_log_exclude_accounts = 'user1@localhost,root@localhost';
---
my.cnf
audit_log_exclude_accounts = user1@localhost,root@localhost

24.bin log

my.cnf文件中,指定「mysql-bin.log」

注意:

log_bin_index=mysql-bin.list

上述文件一览中,对应的文件如果被删除了。

在一览中也要删除

rm mysql-bin.list
touch mysql-bin.list
chown mysql:mysql mysql-bin.list

25.存储过程

1.错误处理
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
TRUNCATE TABLE reuters_interface.reuters_dss_equity_price;
SET p_result = FALSE;
END;

[MySQL] 存储过程错误异常处理例子 --> DECLARE EXIT HANDLER FOR SQLEXCEPTION_系统 运维-CSDN博客

2.GEGIN END

代码中出现如下语句,应该是代码块?退出处理?

GEGIN
END;

3.函数

1.substring_index(str,'.',-2)

substring_index(str,'.',1)
结果是:www
substring_index(str,'.',2)
结果是:www.wikibt
也就是说,如果count是正数,那么就是从左往右数,第N个分隔符的左边的全部内容


相反,如果是负数,那么就是从右边开始数,第N个分隔符右边的所有内容,如:
substring_index(str,'.',-2)
结果为:wikibt.com


有人会问,如果我要中间的的wikibt怎么办?
很简单的,两个方向:
从右数第二个分隔符的右边全部,再从左数的第一个分隔符的左边:
substring_index(substring_index(str,'.',-2),'.',1);

2.str_to_date

mysql类似to_char()to_date()函数mysql日期和字符相互转换方法date_f_kanglong129的博客-CSDN博客

  %Y:代表4位的年份 
  %y:代表2为的年份 
  %m:代表月, 格式为(01……12) 
  %c:代表月, 格式为(1……12) 
  %d:代表月份中的天数,格式为(00……31) 
  %e:代表月份中的天数, 格式为(0……31) 
  %H:代表小时,格式为(00……23) 
  %k:代表 小时,格式为(0……23) 
  %h: 代表小时,格式为(01……12) 
  %I: 代表小时,格式为(01……12) 
  %l :代表小时,格式为(1……12) 
  %i: 代表分钟, 格式为(00……59) 
  %r:代表 时间,格式为12 小时(hh:mm:ss [AP]M) 
  %T:代表 时间,格式为24 小时(hh:mm:ss) 
  %S:代表 秒,格式为(00……59) 
  %s:代表 秒,格式为(00……59) 

26.Mysql的事务隔离级别 4种

【精选】再有人问你MySql 的隔离级别是什么,就把这篇文章发给他!_Hollis Chuang的博客-CSDN博客

==

==

幻读(幻像读)

===============================

在数据库事务处理中,幻像读(Phantom Read)是指在同一个事务中,由于其他事务对数据进行了插入操作,导致当前事务读取到了不同的数据行数量,即产生了"幻象"。

===

幻像读之所以被称为"幻象",是因为它类似于我们在现实生活中产生的视觉幻像,即看到了不存在的事物。在数据库中,如果一个事务在开始时执行了一次查询操作,返回了一些满足特定条件的数据行;然后在该事务执行期间,另一个事务插入了符合该查询条件的新数据行。如果在该事务执行期间,当前事务再次执行相同的查询操作,会发现返回的数据行数量发生了变化,新增了"幻像"数据行。

===

幻像读的出现是因为事务在读取数据时,只对数据行的可见性进行了检查,而未对数据行的数量进行检查。通过并发事务的插入和删除操作,可能导致当前事务读取到了不一致的数据行数量,从而产生了幻像读现象。

====

为了避免幻像读现象的产生,可以使用更高级别的事务隔离级别,如可串行化(Serializable)隔离级别。在可串行化隔离级别下,数据库系统会通过锁定相应的数据行来保证事务的一致性,从而避免了幻像读的发生。

===============================

有四种事务,默认是 [repeateable read

]

再有人问你MySql 的隔离级别是什么,就把这篇文章发给他!_HollisChuang's Blog-CSDN博客

★★★ 【事务隔离级别】 与 【死锁】   ★★★ 

在数据库事务隔离级别中,Read committed和Repeatable read,哪一种更容易产生死锁

在数据库事务隔离级别中,"Repeatable read"更容易产生死锁。

"Read committed"隔离级别允许事务在读取数据时,其他事务也能够修改该数据。因此,在并发环境下,事务之间不太容易产生死锁。

====

相比之下,"Repeatable read"隔离级别下,事务在读取数据时,会将读取的数据加锁,确保其他事务不能修改该数据。这就可能导致多个事务同时获取不同的资源,并且彼此互相等待资源释放,从而产生死锁的可能性增加

xxx

事务中的 select 语句,会对记录加锁吗

事务中的 SELECT 语句在一些特定情况下会对记录加锁,取决于事务的隔离级别和数据库的实现。

在默认的隔离级别下,即“读取已提交”(Read Committed)隔离级别,SELECT 语句一般不会对读取的记录加锁。事务只会对写入(INSERT、UPDATE、DELETE)操作加锁而不会对读取操作加锁。

但是,在更高的隔离级别,例如“可重复读”(Repeatable Read)隔离级别下,某些数据库实现会对 SELECT 语句读取的记录加锁,以确保读取的数据在事务结束前保持一致性。这种情况下,其他事务要修改或删除被锁定的记录时会被阻塞,可能导致并发性能下降。

需要注意的是,数据库的具体实现可能会有所不同,不同的数据库管理系统(DBMS)对事务的隔离级别和锁定行为可能会有不同的实现方式。因此,在使用特定数据库时,应该查阅相关文档以了解该DBMS的具体行为。

xxx

mysql的 Repeatable Read 事务隔离级别,事务中的 select 语句,会对查询的记录加锁吗

在 MySQL 中,如果将事务的隔离级别设置为 "可重复读"(Repeatable Read),则事务中的 SELECT 语句在默认情况下会对查询的记录加锁。

在 "可重复读" 隔离级别下,MySQL 会对 SELECT 语句查询的记录加共享锁(Shared Locks)。这样做的目的是为了确保事务中的查询结果在事务执行期间保持一致性,防止其他并发事务对查询结果进行干扰。

加锁的记录会阻止其他并发事务对其进行写入(INSERT、UPDATE、DELETE)操作,从而保证了事务在读取期间数据的一致性。但是,其他事务仍然可以读取被锁定的记录,不会被阻塞。

在 Repeatable Read 隔离级别下,如果事务执行期间有其他事务修改了被锁定的记录,事务会在读取这些记录时等待锁被释放。这个等待过程可以通过设置 innodb_lock_wait_timeout 参数来控制,超过等待时间后会抛出超时异常。

需要注意的是,MySQL 还提供了锁的级别,例如行锁和表锁,具体的加锁方式会根据查询的条件、索引和配置等因素而有所不同。因此,在具体的使用中,还需要根据实际情况进行调整和优化。

=====

26.Mysql中的各种函数

MySQL DATEDIFF() 函数

・DATEDIFF() 函数返回两个日期之间的天数。

DATEDIFF(date1,date2)

・date_sub(d, INTERVAL expr type)

以当前日期减去一个时间。

MySQL计算日期的函数DATE_SUB(d,INTERVAL expr type)_Java 小菜鸟-CSDN博客

---
应用1. 取得当月1日
date_sub(curdate(), INTERVAL day(curdate()) - 1 DAY)

应用2. 取得两周之内的数据(包括执行日当天)
date_sub(curdate(), INTERVAL 13 DAY)

---

・now()

获取当前时间,常用用于 create_at 等字段

・substring_index()  // 截取到第几个

substrinstring_index('123456789,123,456,789',',',2)
123456789,123

substrinstring_index('123456789,123,456,789',',',1)
123456789

SELECT SUBSTRING_INDEX(‘123456789,123,456,789’, ’ , ’ , -1); //从后面开始算第一个逗号
789

・substring

substrinstring('123456789',-3,1)
7

・str_to_date

str_to_date('20210901', '%Y%m%d')

・CAST()

CAST('20210901' as DATETIME)

CAST函数语法规则是:Cast(字段名 as 转换的类型 ),其中类型可以为:

CHAR[(N)] 字符型
DATE 日期型
DATETIME 日期和时间型
DECIMAL float型
SIGNED int
TIME 时间型
---------

・current_timestamp()

27.Mysql中的一些特性

  ・删除表,这个表对应的触发器也会被删除

  ・使用存储过程插入数据时,不会触发「触发器」 

28.UNION  与 UNION ALL

SQL UNION 和 UNION ALL 操作符

select * from (
 select AAA,BBB,CCC from tableA where ...
    union all
 select AAA,BBB,CCC from tableA where ...
    union all
 select AAA,BBB,CCC from tableA where ...
) t order by AAA, BBB, CCC

29.explain 执行计划 (実行計画)

explain select * from emp where AAA = 'aaa';

---

在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。所以我们深入了解MySQL的基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采用。

MySQL Explain详解 - 杰克思勒(Jacksile) - 博客园 (cnblogs.com)

---

 ---

mysql> explain select count(userid) from user where userid like '%s%';
+----+-------------+-------+------------+------+---------------+------+---------+------+---------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows    | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+---------+----------+-------------+
|  1 | SIMPLE      | user  | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 6428622 |    11.11 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+---------+----------+-------------+
1 row in set, 1 warning (0.01 sec)

---

id:选择标识符
select_type:表示查询的类型。
table:输出结果集的表
partitions:匹配的分区
type:表示表的连接类型
possible_keys:表示查询时,可能使用的索引
key:表示实际使用的索引
key_len:索引字段的长度
ref:列与索引的比较
rows:扫描出的行数(估算的行数)
filtered:按表条件过滤的行百分比
Extra:执行情况的描述和说明

---

30.索引

创建索引

KEY `ix1_XXX` (`xxxx`), //mysql

---

CREATE TABLE `admin_role` (
`adminSet_id` varchar(32) NOT NULL,
`roleSet_id` varchar(32) NOT NULL,
PRIMARY KEY (`adminSet_id`,`roleSet_id`),
KEY `FK9FC63FA6DAED032` (`adminSet_id`),
KEY `FK9FC63FA6C7B24C48` (`roleSet_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 查看索引

show index from yourTableName

31.mysql导出Insert语句

mysqldump  -uroot  -p  --databases 数据库名 --tables 表名1  表名2  >E:db1.sql
mysqldump -uroot -p --databases 数据库名 --tables 表名 --where=字段名='字段值'  >E:a1.sql

有时,会出如下错误

Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that
changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete
dump, pass --all-databases --triggers --routines --events.

32.mediumblob  // mysql 字段   blob数据类型

插入时,‘1100101’即可

33.order by 默认排序 (升序)

SQL语言的默认排序方式是升序,ORDER BY 子句若未显式指定升序(ASC)或降序(DESC),那么就认按默认升序排序。
(mysql的,ASC 排序时,NULL字段在最前面面)原因如下:

mysql中认为null在排序时为最小值,即ASC排序时在最前面,DESC排序时在最后

oracle中认为null在排序时为最大值,即ASC排序时在最后面,DESC排序时在最前

34.Mysql中的  日期数据类型

・datetime

     datetime_column >= '2021-11-04'

・timestamp

35. mysql中的 【\G】

在MySQL的sql语句后加上\G,

表示将查询结果进行按列打印,可以使每个字段打印到单独的行。

即将查到的结构旋转90度变成纵向;

select * from xxx where id=xxx \G

36. mysql修改密码

mysqladmin password yourNewPassword -uYourUserName -p
Enter password:<the old password>

37.mysqsl  +  springboot + dbunit  出现  【AmbiguousTableNameException】解决

ambiguous  英 [æmˈbɪɡjʊəs]   adj. 含混不清的;引起歧义的

问题发生的原因:

    为了使用DBunit,新建了一个数据库(Schema),这个数据库和原来的数据库,拥有相同的Tables,

    使用的JDBC连接的用户,拥有 这两个 数据库(Schema) 的权限。

解决:

Mysql的JDBC连接中,指定Schema无效,需要新建一个用户(只能看到一个Schema的用户),才能解决

========
1.创建测试用用户

create user `dbunit`@`%` identified by `dbunit12345`

2.创建测试用数据库

create database `yourSystemDbDBUnit`
GRANT ALL ON yourSystemDbDBUnit.* to 'dbunit`@`%';

3.配置文件
src/test/resources
└application-test.properties

driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/yourSystemDbDBUnit
username: dbunit
password: dbunit12345
initialization-mode: always

4.数据库定义SQL
src/main/resources
└schema-all.sql

DROP TABLE IF DROP TABLE IF EXISTS XXX_TABLE_1;;
DROP TABLE IF EXISTS XXX_TABLE_2;

CREATE TABLE DROP TABLE IF EXISTS XXX_TABLE_1(


);

CREATE TABLE DROP TABLE IF EXISTS XXX_TABLE_2(


);


========

38.springboot启动,加载数据库定义文件源码分析 :为什么会加载 【schema-all.sql】这个文件

・DataSourceInitializer  #  getScripts

package org.springframework.boot.autoconfigure.jdbc;

。。。。

class DataSourceInitializer {


	private List<Resource> getScripts(String propertyName, List<String> resources, String fallback) {
		if (resources != null) {
			return getResources(propertyName, resources, true);
		}
		String platform = this.properties.getPlatform();
		List<String> fallbackResources = new ArrayList<>();
		fallbackResources.add("classpath*:" + fallback + "-" + platform + ".sql");
		fallbackResources.add("classpath*:" + fallback + ".sql");
		return getResources(propertyName, fallbackResources, false);
	}

・DataSourceInitializer  #  createSchema  #  initSchema

package org.springframework.boot.autoconfigure.jdbc;

。。。。

class DataSourceInitializer {


	boolean createSchema() {
		List<Resource> scripts = getScripts("spring.datasource.schema", this.properties.getSchema(), "schema");
		if (!scripts.isEmpty()) {
			if (!isEnabled()) {
				logger.debug("Initialization disabled (not running DDL scripts)");
				return false;
			}
			String username = this.properties.getSchemaUsername();
			String password = this.properties.getSchemaPassword();
			runScripts(scripts, username, password);
		}
		return !scripts.isEmpty();
	}


	void initSchema() {
		List<Resource> scripts = getScripts("spring.datasource.data", this.properties.getData(), "data");
		if (!scripts.isEmpty()) {
			if (!isEnabled()) {
				logger.debug("Initialization disabled (not running data scripts)");
				return;
			}
			String username = this.properties.getDataUsername();
			String password = this.properties.getDataPassword();
			runScripts(scripts, username, password);
		}
	}

・DataSourceProperties

package org.springframework.boot.autoconfigure.jdbc;

。。。

@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean {


	/**
	 * Platform to use in the DDL or DML scripts (such as schema-${platform}.sql or
	 * data-${platform}.sql).
	 */
	private String platform = "all";

39.JSON_OBJECT

JSON_OBJECT(key, value[, key2, value2, ...])

示例代码

select json_object('mainMessage',muMessage,'repeatMessage',muReply) from messageboard_user;

效果

{"mainMessage": "今天吃什么", "repeatMessage": null}
{"mainMessage": "明天吃什么", "repeatMessage": null}
{"mainMessage": "留言 状态确认", "repeatMessage": "状态修改OK了"}
{"mainMessage": "今天晚上吃什么\r\n焼肉やきにく", "repeatMessage": "はい、焼肉しましょう。\n"}
{"mainMessage": "12345", "repeatMessage": "6666"}
{"mainMessage": "hello hello", "repeatMessage": "english"}
{"mainMessage": "hello hello", "repeatMessage": null}
{"mainMessage": "元宵节快乐", "repeatMessage": "媳妇元宵节快乐"}

 ===

40.XXX

xx

41.XXX

xxx

42.XXX

xxx

====

■Postgre

1。登录

psql -d dbname -U username -W

psql -d dbname -h 192.168.1.50 -p 5432 -U username -W password---------------2013/09/16 追加

(查看帮助 \?)

2。显示所有表

mysql:show tables

pgsql:\dt

2.1 显示所有序列

\ds

2.2显示所有数据库

\l

-------------------------------2010/12/21追加

3.显示所有表结构

mysql:show tables

pgsql:\d  tablename //注意,这时没有t

4.执行SQL语句时,后面要加上分号";"

select * from user;

---------------2013/09/16 追加 4.

5.从postgre中得到数据脚本
pg_dump -U postgres -t tablename -f filename.sql dbname //注意,后面没有';'

SQL文件默认位置は%POSTGRE_PATH%/8.3/bin

 备份整个数据库 指定位置(文件夹要事先建好)

pg_dump -U postgres -t tablename -f /myPostgreSqlBack/db001/db001.sql dbname

2013/01/25追加

在Liunx环境下使用该命令

首先 su postgres 切换到数据库管理者的用户下

然后使用下面的命令导出数据

pg_dump dbname > /tmp/mydbback20130125.dump

5.恢复

psql -U username(postgres) -W
create database mydb001;
psql -h localhost -U postgres -d mydb001 < filename.sql

2013/01/25追加

在Liunx环境下使用该命令

首先 su postgres 切换到数据库管理者的用户下

然后使用下面的命令导入之前备份的文件

psql dbname < /tmp/mydbback20130125.dump

注意:

注意工具的使用,利用postgre的大象工具中,

我们可以直接导出整个DB的数据,然后再清空DB,最后再把数据导入。

6密码修改

ALTER USER postgres WITH PASSWORD 'password' ; //注意,后面有';'

先就用的这么点,以后使用再添加!

2012 04 23 更新

前言在linux下 切换用户 su postgres

1.查看当前系统下所有的数据库

psql -l

Name

saison

coin

loan

atunet

2.进入其中一个DB

psql saison

3.列出此DB下所有的表

\d

user

courses

batch

4.退出在2中进入DB下的状态(在此状态下可执行SQL  前面是saison#)

\q

5.查看整个数据库管理系统的使用情况(saison atunet 等数据库都在这下面)

df -h (这个不是postgre下的命令,是linux下的命令,查看磁盘剩余空间)

6.重新启动postgre

pg_ctl restart

■MySql中 delimiter

默认情况下,不可能等到用户把这些语句全部输入完之后,
再执行整段语句。 
因为mysql一遇到分号,它就要自动执行。 
即,在语句RETURN '';时,mysql解释器就要执行了。 
这种情况下,就需要事先把delimiter换成其它符号,如//或$$。 

===


mysql> delimiter // 
mysql> CREATE FUNCTION `SHORTEN`(S VARCHAR(255), N INT) 
mysql>     RETURNS varchar(255) 
mysql> BEGIN 
mysql> IF ISNULL(S) THEN 
mysql>     RETURN ''; 
mysql> ELSEIF N<15 THEN 
mysql>     RETURN LEFT(S, N); 
mysql> ELSE 
mysql>     IF CHAR_LENGTH(S) <=N THEN 
mysql>    RETURN S; 
mysql>     ELSE 
mysql>    RETURN CONCAT(LEFT(S, N-10), '...', RIGHT(S, 5)); 
mysql>     END IF; 
mysql> END IF; 
mysql> END;// 

===

MySql中 delimiter 详解_有志者事竟成-CSDN博客

■Oracle

数据库学习(Oracle)_sun0322-CSDN博客

ーーー

■DB2

1.启动命令,存储过程

DB2命令行启动、存储过程创建・执行_db2数据库怎么打开_sun0322的博客-CSDN博客

2.用語

1.routine  ルーチン 英 [ruːˈtiːn]  n. 例行公事;日常工作;惯例,常规

db2的routine
routine,一般翻译成“例程”,存在server端,按照应用逻辑编写,可供client或者其他routine调用的数据库对象。
routine分3类:procedure,UDF(用户自定义function),method(提供结构化类型的行为)。
 

2.unexpected token  , 意外的标记 。   予期しないトークン

予期しないトークン "column1"が見つかりました。予期されたトークンに"VALUE"が含まれている可能性があります

3.

4.

5.

3.DB2函数大全

DB2函数大全_db2内置函数_Jerelyn的博客-CSDN博客

4.DB2常用函数持续汇总

DB2常用函数持续汇总-CSDN博客

5.DB2报错整理

DB2报错备忘录(更新中)_db2错误大全_栖霞岭酒馆老板的博客-CSDN博客

6.DB2 JSON

https://www.5axxw.com/questions/content/1dl10s

7.XXX

xxx

8.XXX

xxx

====

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值