存在的记忆 - mysql学习
type: channel
link: https://www.looaon.com/index.php/category/mysql学习/
description: mysql学习
items: 数据库常用Join查询
items: mysql替换指定字段中的字符串
items: AWS RDS上如何使用mysqlbinlog命令下载binlog
items: AWS RDS for MySQL如何终止会话
items: MySQL中show语法
items: 多线程死锁
items: mysql导入导出sql文件
items: mysql学习笔记
items: mysql快速生成百万条测试数据的方法
items: mysql基础

数据库常用Join查询
type: item
date: 2022-07-09T10:46:41+08:00
description: 1.查询A，B表共有部分内容： SELECT <select_list> FROM TableA A INNER JOIN TableB B ON A.Key = B.Key 2.查询A表所有和AB表共有部分： SELECT <select_list> FROM TableA A LEFT JOIN Table B B ON A.Key = B.Key 3.查询B表所有和AB表共有部分： SELECT <select_list> FROM TableA A RIGHT JOIN TableB B ON A.Key = B.Key 4.查询A表独有部分内容： SELECT <select_list> FROM TableA A LEFT JOIN TableB B ON A.Key = TableB B ON A.Key = B.Key WHERE B.Key IS NULL 5.查询B表独有部分: SELECT <select_list> FROM TableA A RIGHT JOIN TableB B ON A.Key = B.Key WHERE A.Key IS NULL 6.查询AB表所有部分： SELECT <sclect_list> FROM TableA A FULL OUTER JOIN TableB B ON A.Key = B.Key 7.查询AB表各自独有部分 SELECT<select_list> FROM TableA A FULL OUTER JOIN TableB B ON A.Key = B.Key WHERE A.Key IS NULL OR B.Key IS NULL

mysql替换指定字段中的字符串
type: item
date: 2020-05-14T21:33:41+08:00
description: mysql 替换函数replace()实现mysql替换指定字段中的字符串mysql 替换字符串的实现方法:mysql中replace函数直接替换mysql数据库中某字段中的特定字符串，不再需要自己写函数去替换，用起来非常的方便。 mysql 替换函数replace()UPDATE `table_name` SET `field_name` = replace (`field_name`,'from_str','to_str') WHERE `field_name` LIKE '%from_str%' 说明：table_name —— 表的名字 field_name —— 字段名 from_str —— 需要替换的字符串 to_str —— 替换成的字符串 例如：mysql> SELECT REPLACE('www.looaon.com', 'www', 'http://looaon.com'); -> 'https://www.looaon.com' 该函数是多字节安全的,也就是说你不用考虑是中文字符还是英文字符.

AWS RDS上如何使用mysqlbinlog命令下载binlog
type: item
date: 2019-06-25T22:28:05+08:00
description: AWS RDS上，可以使用mysqlbinlog来下载binlog，具体命令为：mysqlbinlog \ --read-from-remote-server \ --host=db-endpoint \ --port=3306 \ --user UserName \ --password \ --raw \ --result-file=/tmp/ \ binlog.xxxxx 需要注意Amazon RDS会随时清除binlog内容，并不会持久的保持binlog在数据库实例上，因此如果您可能需要使用 mysql.rds_set_configuration 这个存储过程来修改保持数据库保持binlog的时间，以便您有足够的时间下载binlog。在更改binlog保留时间后，请注意您数据库实例的存储空间，以确保binlog不会占用太多存储空间。 如果需要设置binlog的轮转时间为1天call mysql.rds_set_configuration('binlog retention hours', 24); 通过以下命令查看现在的轮转周期是多少call mysql.rds_show_configuration;

AWS RDS for MySQL如何终止会话
type: item
date: 2019-06-25T22:26:00+08:00
description: mysql.rds_kill_query_id 终止针对MySQL或MariaDB服务器运行的查询。语法CALL mysql.rds_kill_query_id(queryID); 参数queryID 整数。将终止的查询的标识。使用说明要终止针对 MariaDB 服务器运行的查询，请使用 mysql.rds_kill_query_id 过程并传入该查询的 ID。要获取查询 ID，如下所示：SELECT USER, HOST, COMMAND, TIME, STATE, INFO, QUERY_ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = '<user name> 以下示例终止查询 ID 为 11195102 的查询：call mysql.rds_kill_query_id(11195102); 批量kill session的语句:select concat('CALL mysql.rds_kill(',id,');') from information_schema.processlist where user='gwmmm'; select concat('CALL mysql.rds_kill(',trx_mysql_thread_id,');') from information_schema.innodb_trx; CALL mysql.rds_kill( 11195230); CALL mysql.rds_kill( 11195102); CALL mysql.rds_kill( 11195114); CALL mysql.rds_kill( 11195108); CALL mysql.rds_kill( 11195179); CALL mysql.rds_kill( 11195224); CALL mysql.rds_kill( 11195214); CALL mysql.rds_kill( 11194577); CALL mysql.rds_kill( 11195476); CALL mysql.rds_kill( 11194995); CALL mysql.rds_kill( 11195187); CALL mysql.rds_kill( 11195022); CALL mysql.rds_kill( 11195319);

MySQL中show语法
type: item
date: 2019-02-11T16:29:05+08:00
description: 1. show tables或show tables from database_name; -- 显示当前数据库中所有表的名称。 2. show databases; -- 显示mysql中所有数据库的名称。 3. show columns from table_name from database_name; 或show columns from database_name.table_name; -- 显示表中列名称。 4. show grants for user_name; -- 显示一个用户的权限，显示结果类似于grant 命令。 5. show index from table_name; -- 显示表的索引。 6. show status; -- 显示一些系统特定资源的信息，例如，正在运行的线程数量。 7. show variables; -- 显示系统变量的名称和值。 8. show processlist; -- 显示系统中正在运行的所有进程，也就是当前正在执行的查询。大多数用户可以查看他们自己的进程，但是如果他们拥有process权限，就可以查看所有人的进程，包括密码。 9. show table status; -- 显示当前使用或者指定的database中的每个表的信息。信息包括表类型和表的最新更新时间。 10. show privileges; -- 显示服务器所支持的不同权限。 11. show create database database_name; -- 显示create database 语句是否能够创建指定的数据库。 12. show create table table_name; -- 显示create database 语句是否能够创建指定的数据库。 13. show engines; -- 显示安装以后可用的存储引擎和默认引擎。 14. show innodb status; -- 显示innoDB存储引擎的状态。 15. show logs; -- 显示BDB存储引擎的日志。 16. show warnings; -- 显示最后一个执行的语句所产生的错误、警告和通知。 17. show errors; -- 只显示最后一个执行语句所产生的错误。 18. show [storage] engines; --显示安装后的可用存储引擎和默认引擎。 mysql show命令 show databases; show tables from db_name; show columns from table_name from db_name; show index from talbe_name [from db_name]; show status; show variables; show [full] processlist; show table status [from db_name]; show grants for user; 除了status,processlist和grants外，其它的都可以带有like wild选项，它可以使用SQL的'%'和'_'字符； show databases like '%t'; 将会列出所有数据库名字末尾为't'字符的数据库 当然了，在这些sql中，你也可以用db_name.table_name来代替 table_name from db_name这样写会更简便些! 如果一个用户没有一个表的任何权限，表将不在SHOW TABLES或mysqlshow db_name中的输出中显示 大家可能还记得describe table_name ，它实现的是与show columns from db_name.table_name一样的效果 show status将可以用mysqlshow --status 来得到同样的效果 列 含义 Name 表名 Type 表的类型 (ISAM，MyISAM或HEAP) Row_format 行存储格式 (固定, 动态, 或压缩） Rows 行数量 Avg_row_length 平均行长度 Data_length 数据文件的长度 Max_data_length 数据文件的最大长度 Index_length 索引文件的长度 Data_free 已分配但未使用了字节数 Auto_increment 下一个 autoincrement(自动加1）值 Create_time 表被创造的时间 Update_time 数据文件最后更新的时间 Check_time 最后对表运行一个检查的时间 Create_options 与CREATE TABLE一起使用的额外选项 Comment 当创造表时，使用的注释 (或为什么MyS…

多线程死锁
type: item
date: 2019-01-22T18:51:00+08:00
description: c:/users/administrator/documents/code/facebookads/public/ 关于多线程死锁，以前对这个概念总是很朦胧，不知道具体该怎么理解。前不久从网上看到一篇文章，感觉写的很透彻，很形象，现在摘录下来以备日后省查，希望也能对其他人起到帮助。俗话说的好，人多好办事！在程序当中也是这样，如果在同一个应用程序中需要并行处理多件任务，那就可以创建多条线程。但是人多了，往往也会出现冲突，使得这个工作无法进行下去了，（三个和尚没水喝啊），这就是死锁。举个形象的例子，就像三个人（A,B,C）在玩三个球（1,2,3），规则很简单，每个人都必须先拿到自己左手边的球，才能拿自己右边的球，两手都有球之后，才能把球放下。这个游戏看起来似乎可以永远进行下去，但是若干局之后，如果三个人刚好都只拿到自己左手边的球，都等着拿右手边的球，但是因为谁都不能放手，那么这三个人（线程）都将陷入无尽的等待中了，这就是传说中的死锁。下面就用JAVA来举例，例子中已经创建了三个boolean型的静态变量ball1、ball2、ball3（初始值为false），TURE代表球被拿起，FALSE代表球仍放在地上，接下来就是三个线程类：public class test { static class ThreadA extends Thread //A的线程 { @Override public void run() { // TODO Auto-generated method stub //super.run(); while(true)//无限循环 { while(ball3==true)//如果ball3已被拿起，贼进入等待。 {} ball3=true;//当ball3被放下后，立刻拿起 while(ball1==true)//如果ball1已被拿起，则进入等待。 {} ball1=true;//拿起ball1. System.out.println("A已经拿到两球");//输出结果，方便观察死锁状态 ball1=ball3=false;//放下两球 } } } static class ThreadB extends Thread //B的线程 { @Override public void run() { // TODO Auto-generated method stub //super.run(); while(true)//无限循环 { while(ball1==true)//如果ball1已被拿起，贼进入等待。 {} ball1=true;//当ball1被放下后，立刻拿起 while(ball2==true)//如果ball2已被拿起，则进入等待。 {} ball2=true;//拿起ball1. System.out.println("B已经拿到两球");//输出结果，方便观察死锁状态 ball1=ball2=false;//放下两球 } } } static class ThreadC extends Thread //C的线程 { @Override public void run() { // TODO Auto-generated method stub //super.run(); while(true)//无限循环 { while(ball2==true)//如果ball2已被拿起，贼进入等待。 {} ball2=true;//当ball2被放下后，立刻拿起 while(ball3==true)//如果ball3已被拿起，则进入等待。 {} ball3=true;//拿起ball3. System.out.println("C已经拿到两球");//输出结果，方便观察死锁状态 ball2=ball3=false;//放下两球 } } } /** * @param args */ private static boolean ball1,ball2,ball3=false; public static void main(String[] args) { // TODO Auto-generated method stub ThreadA A=new ThreadA(); ThreadB B=new ThreadB(); ThreadC C=new ThreadC(); A.start(); B.start(); C.start(); } } 运行这个程序,你会看到有若干行打印信息后,就不再有输出,那么就说明它“死锁”了。那么我们如何来消除“死锁”呢?首先,让我们来看看产生“死锁”的必要条件:互斥，就是说多个线程不能同时使用同一资源,比如,当线程A使用该资源时,B线程只能等待A释放后才能使用。占有等待…

mysql导入导出sql文件
type: item
date: 2019-01-18T17:14:00+08:00
description: mysql导入导出sql文件window下1.导出整个数据库mysqldump -u 用户名 -p 数据库名 > 导出的文件名 mysqldump -u dbuser -p dbname > dbname.sql 2.导出一个表mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名 mysqldump -u dbuser -p dbname users> dbname_users.sql 3.导出一个数据库结构mysqldump -u dbuser -p -d --add-drop-table dbname >d:/dbname_db.sql -d 没有数据 --add-drop-table 在每个create语句之前增加一个drop table 4.导入数据库常用source 命令 进入mysql数据库控制台，如 mysql -u root -p mysql>use 数据库 然后使用source命令，后面参数为脚本文件(如这里用到的.sql) mysql>source d:/dbname.sql 导入数据到数据库mysql -uroot -D数据库名导入数据到数据库中得某个表mysql -uroot -D数据库名 表名D:\APMServ5.2.6\MySQL5.1\bin>mysqldump -u root -p erp lightinthebox_tags > ligh tinthebox.sql linux下一、导出数据库用mysqldump命令（注意mysql的安装路径，即此命令的路径）：1、导出数据和表结构：mysqldump -u用户名 -p密码 数据库名 > 数据库名.sql #/usr/local/mysql/bin/ mysqldump -uroot -p abc > abc.sql 敲回车后会提示输入密码2、只导出表结构mysqldump -u用户名 -p密码 -d 数据库名 > 数据库名.sql #/usr/local/mysql/bin/ mysqldump -uroot -p -d abc > abc.sql 注：/usr/local/mysql/bin/ ---> mysql的data目录二、导入数据库1、首先建空数据库mysql>create database abc; 2、导入数据库方法一：（1）选择数据库mysql>use abc; （2）设置数据库编码mysql>set names utf8; （3）导入数据（注意sql文件的路径）mysql>source /home/abc/abc.sql; 方法二：mysql -u用户名 -p密码 数据库名 < 数据库名.sql #mysql -uabc_f -p abc < abc.sql

mysql学习笔记
type: item
date: 2019-01-18T16:52:30+08:00
description: Windows服务 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意：等号与值之间有空格) 连接与断开服务器mysql -h 地址 -P 端口 -u 用户名 -p 密码 SHOW PROCESSLIST -- 显示哪些线程正在运行 SHOW VARIABLES -- 显示系统变量信息 数据库操作 查看当前数据库 SELECT DATABASE(); -- 显示当前时间、用户名、数据库版本 SELECT now(), user(), version(); -- 创建库 CREATE DATABASE[ IF NOT EXISTS] 数据库名 数据库选项 数据库选项： CHARACTER SET charset_name COLLATE collation_name -- 查看已有库 SHOW DATABASES[ LIKE 'PATTERN'] -- 查看当前库信息 SHOW CREATE DATABASE 数据库名 -- 修改库的选项信息 ALTER DATABASE 库名 选项信息 -- 删除库 DROP DATABASE[ IF EXISTS] 数据库名 同时删除该数据库相关的目录及其目录内容 表的操作-- 创建表 CREATE [TEMPORARY] TABLE[ IF NOT EXISTS] [库名.]表名 ( 表的结构定义 )[ 表选项] 每个字段必须有数据类型 最后一个字段后不能有逗号 TEMPORARY 临时表，会话结束时表自动消失 对于字段的定义： 字段名 数据类型 [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY] [COMMENT 'string'] -- 表选项 -- 字符集 CHARSET = charset_name 如果表没有设定，则使用数据库字符集 -- 存储引擎 ENGINE = engine_name 表在管理数据时采用的不同的数据结构，结构不同会导致处理方式、提供的特性操作等不同 常见的引擎：InnoDB MyISAM Memory/Heap BDB Merge Example CSV MaxDB Archive 不同的引擎在保存表的结构和数据时采用不同的方式 MyISAM表文件含义：.frm表定义，.MYD表数据，.MYI表索引 InnoDB表文件含义：.frm表定义，表空间数据和日志文件 SHOW ENGINES -- 显示存储引擎的状态信息 SHOW ENGINE 引擎名 {LOGS|STATUS} -- 显示存储引擎的日志或状态信息 -- 自增起始数 AUTO_INCREMENT = 行数 -- 数据文件目录 DATA DIRECTORY = '目录' -- 索引文件目录 INDEX DIRECTORY = '目录' -- 表注释 COMMENT = 'string' -- 分区选项 PARTITION BY ... (详细见手册) -- 查看所有表 SHOW TABLES[ LIKE 'pattern'] SHOW TABLES FROM 表名 -- 查看表机构 SHOW CREATE TABLE 表名 （信息更详细） DESC 表名 / DESCRIBE 表名 / EXPLAIN 表名 / SHOW COLUMNS FROM 表名 [LIKE 'PATTERN'] SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern'] -- 修改表 -- 修改表本身的选项 ALTER TABLE 表名 表的选项 eg: ALTER TABLE 表名 ENGINE=MYISAM; -- 对表进行重命名 RENAME TABLE 原表名 TO 新表名 RENAME TABLE 原表名 TO 库名.表名 （可将表移动到另一个数据库） -- RENAME可以交换两个表名 -- 修改表的字段机构（13.1.2. ALTER TABLE语法） ALTER TABLE 表名 操作名 -- 操作名 ADD[ COLUMN] 字段定义 -- 增加字段 AFTER 字段名 -- 表示增加在该字段名后面 FIRST -- 表示增加在第一个 ADD PRIMARY KEY(字段名) -- 创建主键 ADD UNIQUE [索引名] (字段名)-- 创建唯一索引 ADD INDEX [索引名] (字段名) -- 创建普通索引 DROP[ COLUMN] 字段名 -- 删除字段 MODIFY[ COLUMN] 字段名 字段属性 -- 支持对…

mysql快速生成百万条测试数据的方法
type: item
date: 2018-12-27T14:09:00+08:00
description: 有时候我们需要对大数据进行测试，本地一般没有那么多数据，就需要我们自己生成一些。下面会借助内存表的特点进行生成百万条测试数据。 创建一个临时内存表, 做数据插入的时候会比较快些-- 创建一个临时内存表 DROP TABLE IF EXISTS `vote_record_memory`; CREATE TABLE `vote_record_memory` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `user_id` varchar(20) NOT NULL DEFAULT '', `vote_num` int(10) unsigned NOT NULL DEFAULT '0', `group_id` int(10) unsigned NOT NULL DEFAULT '0', `status` tinyint(2) unsigned NOT NULL DEFAULT '1', `create_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`id`), KEY `index_user_id` (`user_id`) USING HASH ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 创建一个普通表，用作模拟大数据的测试用例DROP TABLE IF EXISTS `vote_record`; CREATE TABLE `vote_record` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `user_id` varchar(20) NOT NULL DEFAULT '' COMMENT '用户Id', `vote_num` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '投票数', `group_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '用户组id 0-未激活用户 1-普通用户 2-vip用户 3-管理员用户', `status` tinyint(2) unsigned NOT NULL DEFAULT '1' COMMENT '状态 1-正常 2-已删除', `create_time` int(10) unsigned NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间', PRIMARY KEY (`id`), KEY `index_user_id` (`user_id`) USING HASH COMMENT '用户ID哈希索引' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='投票记录表'; 为了数据的随机性和真实性，我们需要创建一个可生成长度为n的随机字符串的函数。--创建生成长度为n的随机字符串的函数 DELIMITER // -- 修改MySQL delimiter：'//' DROP FUNCTION IF EXISTS `rand_string` // SET NAMES utf8 // CREATE FUNCTION `rand_string` (n INT) RETURNS VARCHAR(255) CHARSET 'utf8' BEGIN DECLARE char_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; DECLARE return_str varchar(255) DEFAULT ''; DECLARE i INT DEFAULT 0; WHILE i < n DO SET return_str = concat(return_str, substring(char_str, FLOOR(1 + RAND()*62), 1)); SET i = i+1; END WHILE; RETURN return_str; END // 为了操作方便，我们再创建一个插入数据的存储过程-- 创建插入数据的存储过程 DROP PROCEDURE IF EXISTS `add_vote_record_memory` // CREATE PROCEDURE `add_vote_record_memory`(IN n INT) BEGIN DECLARE i INT DEFAULT 1; DECLARE vote_num IN…

mysql基础
type: item
date: 2018-11-02T11:08:00+08:00
description: No.1 数据库概念 什么是数据库？ 数据库就是一种特殊的文件，内部存储着需要的数据 RDBMS 所谓关系数据库，是建立在关系模型基础的数据库，借助于集合代数等数学概念和方法来处理数据库中的数据 SQL SQL是结构化语言，是一种用来操作关系数据库的数据库语言。 Python全栈开发当中MySQL是一个难点，今天一文带你掌握 MySQL MySQL是一个关系数据库管理系统 特点： 使用C和C++编写，并使用了多种编译器进行测试，保证源代码的可移植性 支持多种操作系统，如Linux、Windows、AIX、FreeBSD、HP-UX、MacOS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris等 为多种编程语言提供了API，如C、C++、Python、Java、Perl、PHP、Eiffel、Ruby等 支持多线程，充分利用CPU资源 优化的SQL查询算法，有效地提高查询速度 提供多语言支持，常见的编码如GB2312、BIG5、UTF8 提供TCP/IP、ODBC和JDBC等多种数据库连接途径 提供用于管理、检查、优化数据库操作的管理工具 大型的数据库。可以处理拥有上千万条记录的大型数据库 支持多种存储引擎 MySQL 软件采用了双授权政策，它分为社区版和商业版，由于其体积小、速度快、总体拥有成本低，尤其是开放源码这一特点，一般中小型网站的开发都选择MySQL作为网站数据库 MySQL使用标准的SQL数据语言形式 Mysql是可以定制的，采用了GPL协议，你可以修改源码来开发自己的Mysql系统 在线DDL更改功能 复制全局事务标识 复制无崩溃从机 复制多线程从机 No.2 数据完整性 一个数据库就是一个完整的业务单元，可以包含多张表，在表中为了更加精准的存储数据，保证数据的正确性，可以在创建表的时候，为表增加一些强制性的验证，包括数据类型、约束 数据类型 整数：int，bit 小数：decimal 字符串：varchar,char 日期时间: date, time, datetime 枚举类型(enum) decimal表示浮点数，如decimal(5,2)表示共存5位数，小数占2位 char表示固定长度的字符串，如char(3)，如果填充ab时会补一个空格 varchar表示可变长度的字符串，如varchar(3)，填充ab时就会存储ab 字符串text表示存储大文本，当字符大于4000时推荐使用 对于图片、音频、视频等文件，不存储在数据库中，而是上传到某个服务器上，然后在表中存储这个文件的保存路径 Python全栈开发当中MySQL是一个难点，今天一文带你掌握 Python全栈开发当中MySQL是一个难点，今天一文带你掌握 日期时间类型 Python全栈开发当中MySQL是一个难点，今天一文带你掌握 约束 主键primary key：物理上存储的顺序 非空not null：此字段不允许填写空值 惟一unique：此字段的值不允许重复 默认default：当不填写此值时会使用默认值，如果填写时以填写为准 外键foreign key：对关系字段进行约束，当为关系字段填写值时，会到关联的表中查询此值是否存在，如果存在则填写成功，如果不存在则填写失败并抛出异常 No.3 命令行脚本 数据库操作 show databases; 查看数据库 use 数据库名; 使用数据库 select database(); 查看当前使用的数据库 create database 数据库名 charset=utf8； 创建数据库 drop database 数据库名; 删除数据库 数据表操作 show tables; 查看当前数据库中的所有表 desc 表名; 查看表结构 创建表 create table students( id int unsingned primary key auto_increment not null, name varchar(20) default '', age int unsingned default 0, height descimal(3,2) default 1.8, gender enum('男','女') default '男' ) alter table 表名 add 列名 类型; 添加字段 alter table 表名 change 类型及约束; 修改字段 alter table 表名 change 原名 新名 类型及约束; 修改字段(重命名字段) alter table 表名 drop 列名; 删除字段 drop table 表名; 删除表 show create table 表名; 查看表的创建语句 数据增删改查 增 insert into 表名 values(); …