29、设置自增起始值

alter table xxx AUTO_INCREMENT=1;

28、查询表字段,并转换,注意我的例子中,最后都以逗号结尾

SELECT
concat ( COLUMN_NAME, ' as ', "'", column_comment, "'", ',' ) columnName
FROM
information_schema.COLUMNS
WHERE
TABLE_SCHEMA = 'dbName'
AND TABLE_NAME = 'tbName';

27、查询表字段

select TABLE_NAME,GROUP_CONCAT(COLUMN_NAME) from information_schema.columns where TABLE_SCHEMA = '数据库名' group by TABLE_NAME
select TABLE_NAME,GROUP_CONCAT(COLUMN_NAME) from information_schema.columns where TABLE_SCHEMA = '数据库名' and table_name = '表名' group by TABLE_NAME;

26、分区需要注意的地方

  1. 如果数据是属于某个分区,但实际上并没有创建和这个分区,就会报错,例如2019-09-11属于第36周,ERROR:1526 - Table has no partition for value 201936

  2. 增加分区alter TABLE table_name add PARTITION (PARTITION p201953 VALUES LESS THAN MAXVALUE );

  3. 删除分区的同时也会将分区的数据删除alter TABLE table_name drop PARTITION p201929 ;

  4. 按照范围分区时,在最后加上超过定义的最大范围的数据放在maxvalue分区内

  5. 案例:按周进行分区

    CREATE TABLE `tb_push_record` (`msg_id` char(36) NOT NULL,`data_time` date NOT NULL COMMENT '推送时间',PRIMARY KEY (`msg_id`,`data_time`) USING BTREE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT
    PARTITION BY RANGE (YEARWEEK(data_time)) (
    PARTITION p202001 VALUES LESS THAN (202001),
    PARTITION p202002 VALUES LESS THAN (202002),
    PARTITION p202003 VALUES LESS THAN (202003),
    ...
    PARTITION p202049 VALUES LESS THAN (202049),
    PARTITION p202050 VALUES LESS THAN (202050),
    PARTITION p202051 VALUES LESS THAN (202051),
    PARTITION p202052 VALUES LESS THAN (202052),
    PARTITION p202053 VALUES LESS THAN MAXVALUE );
    

25、mysql查看innodb最近一次的执行记录

show engine innodb status\G;

24、mysqldatetime、date、timestamp类型的列查询时是按照字符串查询的。mysql支持java使用StringDate传递参数,并查询数据

select * from tb where data_date between 2019-03-14 and 2019-03-14
select * from tb where data_date >= '2019-03-14'

23、count计数时,如果与group by连用,那么count可能为null

22、join连接使用索引,避免全表扫描

21、查看mysql日志路径

show variables like 'general_log_file';
show variables like 'log_error';
show variables like 'slow_query_log_file';

20、一次执行多个sql时,可能会出现重复的主键、表已经存在、不存在的列等等的错误,如何让mysql遇到这些问题时跳过并继续执行下面的命令?
我们可以创建.sql文件,把所有的sql写入文件,使用cmd执行如下命令,其中--force是确保继续执行的关键,keycloak是数据库名。

mysql -uroot -proot --force keycloak < C:\Users\yangzhen\Desktop\keycloak-database-update.sql

19、数据库连接的url参数

jdbc:mysql://10.8.12.113:3306/keycloak?autoReconnect=true&useUnicode=true&createDatabaseIfNotExist=true&characterEncoding=UTF-8&useSSL=true

xml配置文件中,&符号需要转义:&amp;

jdbc:mysql://10.8.12.113:3306/keycloak?autoReconnect=true&amp;useUnicode=true&amp;createDatabaseIfNotExist=true&amp;characterEncoding=UTF-8&amp;useSSL=true

18、数据库授权

-- GRANT 权限 ON 数据库.表 TO '用户' @ 'ip' IDENTIFIED BY '密码' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'root' @'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
FLUSH PRIVILEGES;

17、mysqldump

mysqldump -h1.1.1.1 -uroot -p database_name table_name --where="condition1='1321312312981' and condition2 > '2018-10-23 07:32:00'"  > f:/data.sql
注意:不能以分号结尾,否则报错:`mysqldump: Couldn't find table: ";"`

16、insert into select

语法:insert into table2(field1,field2,...) select value1,value2,... from table1
案例:
INSERT INTO db_test.tb_user ( user_id, user_name, app_id, app_code, create_time ) SELECT
account_id,
account_name,
biz_code,
biz_code,
now()
FROMdb_test_old.tb_user_old;

15、查看表结构信息

-- 查询表结构信息
SELECT * FROM information_schema.tables WHERE table_schema='database_name' AND table_name='table_name'-- 查询表中所有的列,按照表分组
SELECT TABLE_SCHEMA,GROUP_CONCAT(COLUMN_NAME) FROM information_schema.`COLUMNS` WHERE table_schema='database_name' AND table_name='table_name' group by TABLE_SCHEMA

14、允许远程连接mysql

use mysql;
select user,host from user;
grant all privileges on *.* to 'root'@'%' identified by 'root';
flush privileges;

13、ON DUPLICATE KEY UPDATE
详细使用方法,请点这里

1、命令行登录客户端

mysql -h localhost -u root -p database_name

2、命令行客户端修改密码

# 其中PASSWORD是一个加密函数
update mysql.user set password=PASSWORD('123') where user='root';
flush privileges;

3、delete 删除数据需要注意别名问题

# from 后指定了表的别名时,delete 后面必须要加上别名,否则有语法错误
DELETE ui FROM user_info ui WHERE ui.name = '德莱文';

4、update 更新数据时,需要注意 where 后面的 from 子句不能包含要更新的表

# 错误演示
UPDATE user_info a SET a.name = '文森特' WHERE a.id IN ( SELECT b.id FROM user_info b WHERE b.name = '德莱文' );
# 正确演示
UPDATE user_info a JOIN ( SELECT b.id FROM user_info b WHERE b.name = '德莱文' ) c ON a.id = c.id SET a.name = '文森特';

5、count(*)count(1)count(column) 区别
参见:count(*)、count(1)、count(column)区别和执行效率

6、unionunion all 的联合查询
    union 的查询结果不会有重复项,因为它的内部使用了一次 distinct,而 union all 的查询结果包含重复项。
注意:参与联合查询的各查询结果的列数必须相同,对应项的数据类型也必须相同

7、if 相关的函数

# IF(expr,t f) 如果 expr 是真,返回 t;否则返回 f
SELECT name, IF ( name = '文森特', '斧头', '无' ) '装备' FROM user_info# IFNULL(value1,value2) 如果 value1 为 null,返回 value2
SELECT IFNULL(name, '无名') name FROM user_info

8、distinct 多列时只要有一列不同,则不去重

distinct 关键字应用于所有列而不是它后面的第一个列。一般情况下去重时,distinct 后面的列要包含 unique 的列,否则查询可能会出错。例如:查询入住信息,并标记这段时间内入住的新用户。新用户定义:在查询时间段开始的时间前没有入住过的用户,是新用户。例如下面的SQL,查询结果如下,distinct多列时只要有一列不同,则不去重

select distinct hch.user_id userId,a.newCustomer from tb_hotel_customer_history hch left join
(select user_id,name, case when check_in_time < '2019-11-18 00:00:00' then 2 else 1 end newCustomer from tb_hotel_customer_history  where group_id = 154898966604025856 and sub_group_id = 154959708522942464) a on hch.user_id = a.user_id
where group_id = 154898966604025856 and sub_group_id = 154959708522942464 and hch.check_in_time >='2019-11-18 00:00:00' and hch.check_in_time <='2019-11-30 23:59:59'

SELECTa.user_id,
CASEWHEN ISNULL( b.user_id ) THEN1 ELSE 2 END newUser
FROM( SELECT DISTINCT user_id FROM tb_hotel_user WHERE check_in_time >= '2019-10-03 00:00:00' AND check_in_time <= '2019-12-02 23:59:59' ) a
LEFT JOIN ( SELECT user_id FROM tb_hotel_user WHERE check_in_time <= '2019-12-02 23:59:59' GROUP BY user_id HAVING count( * ) > 1 ) b ON a.user_id = b.user_id
-- 创建表  学生表
CREATE TABLE `edu_student` (`stu_id` VARCHAR (16) NOT NULL COMMENT '学号',`stu_name` VARCHAR (20) NOT NULL COMMENT '学生姓名',PRIMARY KEY (`stu_id`)
) COMMENT = '学生表' ENGINE = INNODB;-- 课程表
CREATE TABLE `edu_courses` (`course_no` VARCHAR (20) NOT NULL COMMENT '课程编号',`course_name` VARCHAR (100) NOT NULL COMMENT '课程名称',PRIMARY KEY (`course_no`)
) COMMENT = '课程表' ENGINE = INNODB;-- 成绩表
CREATE TABLE `edu_score` (`stu_id` VARCHAR (16) NOT NULL COMMENT '学号',`course_no` VARCHAR (20) NOT NULL COMMENT '课程编号',`scores` FLOAT NULL DEFAULT NULL COMMENT '得分',PRIMARY KEY (`stu_id`, `course_no`)
) COMMENT = '成绩表' ENGINE = INNODB;INSERT INTO edu_student (stu_id, stu_name)
VALUES('1001', '盲僧'),('1002', '盲僧');
-- 课程表数据
INSERT INTO edu_courses (course_no, course_name)
VALUES('C001', '大学语文'),('C002', '新视野英语'),('C003', '离散数学'),('C004','概率论与数理统计'),('C005', '线性代数'),('C006', '高等数学');
-- 成绩表数据
INSERT INTO edu_score (stu_id, course_no, scores)
VALUES('1001', 'C001', 67),   ('1002', 'C001', 67),   ('1001', 'C002', 87),   ('1002', 'C002', 87), ('1001', 'C003', 83),   ('1002', 'C003', 83),   ('1001', 'C004', 88),   ('1002', 'C004', 88),('1001', 'C005', 77),   ('1002', 'C005', 78);SELECTdistinctest.stu_name,sum(ese.scores)
FROMedu_student est
JOIN edu_score ese ON est.stu_id = ese.stu_id
GROUP BYest.stu_id

9、case when 和行转列
参见:case when 和行转列

10、group by 分组统计

注意:1)ROLLUP和 ORDER BY 是互相排斥的 2)LIMIT 用在 ROLLUP 后面

# 语法:FROM tablename [WHERE where_contition][GROUP BY field1,field2,……fieldn [WITH ROLLUP]] [HAVING where_contition]SELECTifnull(a.year_, '合计') '年',a.total,a.order_total
FROM(SELECTDATE_FORMAT(create_date, '%Y') year_,sum(payable_amount) AS total,count(*) AS order_totalFROMshop_orderGROUP BYdate_format(create_date, '%Y') WITH ROLLUP) a;

数据:

CREATE TABLE `shop_order` (`id` char(36) NOT NULL COMMENT 'id',`create_date` datetime NOT NULL COMMENT '创建日期',`modify_date` datetime NOT NULL COMMENT '修改日期',`order_number` varchar(50) NOT NULL COMMENT '订单编号',`payable_amount` decimal(10,2) NOT NULL COMMENT '应付金额',PRIMARY KEY (`id`),UNIQUE KEY `shop_order_number` (`order_number`),KEY `create_date` (`create_date`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商城订单表';INSERT INTO `shop_order`
VALUES
( 'fe4918e8-2cfd-4077-949b-79db2452d8da', '2017-10-25 17:21:39', '2017-07-25 17:21:39', 'NT20170725000043', '66.00' ),
( 'fe565435-52dd-410e-b43d-a1529530fec8', '2016-11-15 17:06:59', '2017-03-15 17:06:59', 'NT20170315000003', '223.10' ),
( 'fe77e32f-890d-460b-8957-96a4a378ddd3', '2018-03-17 09:42:54', '2017-06-17 09:42:54', 'NT20170617000008', '55.00' ),
( 'fe839068-0f1d-45dd-9290-830fab3b638e', '2017-08-29 15:34:24', '2017-08-29 15:34:24', 'NT20170829000024', '114.00' ),
( 'feaaa6e3-1520-417e-afc4-dee37df736a2', '2018-03-29 11:16:06', '2017-08-29 11:16:06', 'NT20170829000018', '114.00' ),
( 'feb2147d-5f5c-4a80-9035-da8be2ae8f98', '2017-03-27 13:01:59', '2017-06-27 13:01:59', 'NT20170627000015', '162.00' ),
( 'fec7a900-7644-452f-bfc1-bffb46d24481', '2017-07-22 11:08:06', '2017-06-22 11:08:06', 'NT20170622000025', '48.00' ),
( 'fecce78d-14f7-48c3-93f8-de470030a55f', '2017-06-10 10:13:34', '2017-07-10 10:13:34', 'NT20170710000001', '180.00' ),
( 'feeb950a-a624-4b40-8abe-cde13bab5dd9', '2018-02-28 14:22:36', '2017-08-28 14:22:36', 'NT20170828000009', '288.00' ),
( 'fef7e6ef-d361-4d79-a06a-ca6106e2c6a9', '2018-01-14 16:33:02', '2017-08-14 16:33:02', 'NT20170814000014', '132.00' ),
( 'fefcd408-ef18-4533-a13a-4bf6116709d8', '2017-11-30 17:30:20', '2017-07-31 17:30:20', 'NT20170731000028', '114.00' ),
( 'feffded3-f5f6-480e-9e6a-1501c86c13b1', '2017-09-24 14:27:19', '2017-07-24 14:27:19', 'NT20170724000009', '660.00' ),
( 'ff02a9e7-43e7-42b9-9068-d1d8c29f9d7d', '2017-12-03 11:13:14', '2017-08-03 11:13:14', 'NT20170803000016', '144.00' ),
( 'ff06abf4-a56a-4756-87bb-b1d054acc4fb', '2017-02-26 09:51:58', '2017-06-26 09:51:58', 'NT20170626000009', '48.00' ),
( 'ff16e6f7-bf7b-47a4-b55c-3f7e397e60b1', '2017-04-03 15:16:43', '2017-07-03 15:16:43', 'NT20170703000011', '31.00' ),
( 'ff227299-f4b9-41d1-a53b-10b8804608a1', '2017-05-07 16:06:33', '2017-07-07 16:06:33', 'NT20170707000033', '48.00' ),
( 'ff26cbc4-25d0-4252-ba5b-5669bad78f3d', '2016-12-08 00:03:35', '2017-04-08 00:03:35', 'NT20170408000001', '206.60' ),
( 'ff6e5032-23aa-44dc-87fb-94c479d02bf6', '2017-08-22 11:03:31', '2017-07-22 11:03:31', 'NT20170722000008', '48.00' ),
( 'ff9fdb57-2343-4c25-8711-9d66b7a3adad', '2016-10-17 14:10:42', '2017-05-17 14:10:42', 'NT20170517000009', '208.00' ),
( 'ffb59cf1-ca94-47d7-91fd-2dd03c097a3c', '2017-05-12 11:38:18', '2017-06-12 11:38:18', 'NT20170612000010', '96.00' ),
( 'ffccfdfe-0fcc-4e53-b3e0-5020845f85af', '2017-04-07 17:13:18', '2017-06-07 17:13:18', 'NT20170607000023', '797.70' ),
( 'ffcda1bd-23b6-47d4-a8e6-3b2934780a22', '2017-01-24 09:00:27', '2017-06-24 09:00:27', 'NT20170624000003', '66.00' ),
( 'ffe2a267-2edc-43c9-a975-dd7579530f37', '2017-07-13 17:25:21', '2017-07-13 17:25:21', 'NT20170713000033', '66.00' );

11、ignore 的使用

INSERT INTO shop_order select * from shop_order
[SQL] INSERT INTO shop_order  select * from shop_order
[Err] 1062 - Duplicate entry 'fe4918e8-2cfd-4077-949b-79db2452d8da' for key 'PRIMARY'# 使用 ignore 忽略错误(不忽略语法错误),返回 0,可以通过这个判断是否执行成功
# 例如:定义联合主键,通过联合主键判断是否有重复的插入,就可以用 ignore
INSERT IGNORE INTO shop_order select * from shop_order
[SQL] INSERT IGNORE INTO shop_order  select * from shop_order
受影响的行: 0

12、临时变量的使用,当且仅当在当前登录的mysql客户端下可以使用,重新打开一个客户端无法使用,或者使用 navicat 新建两个查询窗口,那么另一个窗口无法使用其他窗口中定义的临时变量

# 设置变量:set @变量名=值
# 获取变量:select @变量名
# 结合 sql 语句使用临时变量
select @max_sort:=a.max_sort from ( select max(sort) max_sort from sys_resource where parent_id='0') a ;
update sys_resource set sort = @max_sort + 1 where name='商城设置' and parent_id='0' ;

MySQL实战开发技巧相关推荐

  1. Expression Blend实战开发技巧 第四章 从最常用ButtonStyle开始 - PathButton

    本文来自 烤地瓜 的博客,原文地址:http://www.cnblogs.com/kaodigua/archive/2011/02/15/1955472.html [全面解禁!真正的Expressio ...

  2. 【.NET 日常开发技巧】一个性能强悍的HttpClient 库

    微信公众号:趣编程ACE 关注可了解更多的.NET日常实战开发技巧,如需源码请公众号留言源码即可; 源码如下:1// See https://aka.ms/new-console-template f ...

  3. 《大型数据库技术》MySQL的进阶开发技巧

    MySQL的进阶开发技巧 1.MySQL的存储过程 1.1 创建企业销售系统的数据库,命名为salesdb 1.2 创建一张商品销售表,命名为salerecords,包括如下字段:商品ID,商品名称, ...

  4. 移动端H5页面编辑器开发实战--经验技巧篇

    一.前言 在上一篇<原理结构篇>中,主要针对移动端网页进行了分类描述,并介绍了H5编辑器的需求.原理以及框架结构,本文将延续开发实战这一主题,针对策略和开发技巧做进一步的介绍. 二.策略篇 ...

  5. 分享Node.js + Koa2 + MySQL + Vue.js 实战开发一套完整个人博客项目网站

    这是个什么的项目? 使用 Node.js + Koa2 + MySQL + Vue.js 实战开发一套完整个人博客项目网站. 博客线上地址:www.boblog.com Github地址:https: ...

  6. 鸿蒙系统开发实战-开发一个聊天技巧软件堪称聊天神器

    鸿蒙开发实战-开发一个聊天助手APP 鸿蒙系统开发实战-开发一个聊天技巧软件堪称聊天神器.目前鸿蒙系统可真是过了一把自主研发的瘾,通过一个鸿蒙程序开发实战教程来演示如何开发一款聊天神器,视频教程放在了 ...

  7. 使用C语言调用mysql数据库编程实战以及技巧

    今天编写使用C语言调用mysql数据库编程实战以及技巧,为其他IT同行作为参考,当然有错误可以留言,共同学习. 一.mysql数据库的C语言常用接口API 1.首先当然是链接数据库mysql_real ...

  8. OceanBase 从0到1数据库内核实战教程学习笔记 - 3.OceanBase基础架构和开发技巧

    这篇文章主要介绍王泽林老师分享的 <OceanBase 的基础架构和开发技巧>.如果您看过第一篇文章的对应视频,会发现整个系列主要分为 MiniOB 和 OceanBase 两个系列,本篇 ...

  9. 【MySQL】37 个 MySQL 数据库小技巧

    1.概述 转载:37 个 MySQL 数据库小技巧,不看别后悔! 无论是运维.开发.测试,还是架构师,数据库技术是一个必备加薪神器,那么,一直说学习数据库.学MySQL,到底是要学习它的哪些东西呢? ...

最新文章

  1. 9.3 Trains and Evaluates the MNIST network using a feed dictionary
  2. oracle推送短信,ORACLE 10G如何实现发短信的服务?
  3. Linux进程之间通信 信号
  4. python中head_Python(Head First)学习笔记:六
  5. hbase导入csv文件_HBase 数据导入 ImportTsv
  6. C#WinForm 窗体单例模式 反射单例
  7. 去除input填充颜色
  8. java project 项目在 linux 下面部署步骤
  9. Photoshop 入门教程「4」如何使用撤消命令?
  10. angularjs sill 创建项目_AngularJS快速上手,从安装到运行
  11. FIT2CLOUD入选2018 Gartner Cool Vendor
  12. eclipse安装教程|最详细eclipse安装 配置图文教程
  13. 【GIS开发】批量下载和拼接地图瓦片(Python)
  14. kali 切换图形界面_kali切换桌面环境
  15. python转义是什么意思_什么是python转义字符?看看人士如何理解它.
  16. 开展网络口碑营销之前必须做好的几件事
  17. Android Studio如何连接手机设备
  18. 爆款“小黄鸭”之后,实在RPA助力电商人双11提销量
  19. cocos2d-x Android游戏黑屏解决办法
  20. 接口自动化思路_JAVA

热门文章

  1. QT5打开图片并显示
  2. Ubuntu子系统上安装miniconda.sh 438、444报错
  3. JS高频面试题,请查阅,务必收藏持续更新
  4. DHT21程序,DHT21与DHT11的不同处
  5. 一起入门Citrix_XenDesktop7系列 十--跟着图片交付VMware平台Personal vDisk Windo
  6. 李宁卖咖啡,意欲何为?
  7. Web前端JQuery入门实战案例
  8. GSMArena魅族mx四核评测全文|去除英文|
  9. 高级语言?编译程序?解释程序?目标代码?
  10. win7+bugzilla+apache+mysql+activePerl