MySQL数据库汇总

SELECT i.order_id AS orderId, GROUP_CONCAT(d.item_name, '×', d.num, CHAR(10 using utf8)) AS itemInfo, i.create_time AS createTime, i.user_name AS userName, i.user_phone AS userPhone, i.status AS status, i.total_amount AS totalAmount
FROM order_info i
LEFT JOIN order_detail d
ON i.order_id = d.order_id GROUP BY i.order_id ORDER BY i.order_id ASC;

 

select t1.order_no,GROUP_CONCAT(t2.barcode) as barCode from mt_bus_order_head as t1
left join mt_bus_order_detail as t2
on t1.id=t2.order_id
where t1.order_type=1
and t1.order_status=1
and t1.order_data_source=1
and t2.barcode is not NULL
and t1.trans_date >= '2022-08-02 00:00:00' and t1.trans_date <= concat('2022-08-02', ' 23:59:59')
and t1.order_no in ()
GROUP BY t1.order_no

 

 

 

select (CASE WHEN IFNULL(t2.is_sales,0)=0 THEN 'haha' ELSE 'hehe' END) as ss from mt_prod_goods as t2

select (case when t2.is_sales=0 THEN 'haha' ELSE 'hehe' END) as ss from mt_prod_goods as t2

 

insert into mt_org_store_type_config select  id,store_no,`name`,type,creator,create_date,updater,update_date  from mt_org_store 

 

SELECT DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 90 DAY),'%Y-%m-%d');

SELECT DATE_FORMAT(NOW(),'%Y-%m-%d');

SELECT DATE_FORMAT(trans_date,'%Y-%m-%d') from mt_bus_order_head where cust_id=1495232982760509441


select cust_id,count(1) from mt_bus_order_head where cust_id=1495232982760509441 and DATE_FORMAT(trans_date,'%Y-%m-%d') BETWEEN DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 90 DAY),'%Y-%m-%d') AND DATE_FORMAT(NOW(),'%Y-%m-%d')

 

-- 格式化当前日期 2020-04-07 23:23:23 date_format(now(),'%Y-%m-%d %H:%i:%s' )

-- 格式化当前时间 23:23:23 time_format(CURTIME(),'%H:%i:%s')  

 

date_format(now(),'%Y-%m-%d %H:%i:%s' )

date_format(current_date()-1,'%Y-%m-%d')


1.给当前日期减一天
SELECT DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 DAY),'%Y-%m-%d');
2.给当前日期加一天
SELECT DATE_FORMAT(DATE_ADD(NOW(),INTERVAL 1 DAY),'%Y-%m-%d');



分组查询
select post_type,post_code,post_name,sort,id from sys_post where `status`=1  GROUP BY post_type,post_code,post_name,sort,id

查询更新
update sys_menu as a
INNER JOIN(
SELECT t1.id as id ,t2.field_value as fieldValue
from sys_menu as t1
left join sys_language as t2
on t2.table_id=t1.id
where t2.language = 'zh-CN'
) as b
on a.id=b.id
set a.menu_name=b.fieldValue

Insert into mt_bus_cust_order_num_log(cust_id,num) select cust_id,COUNT(1) as num from  mt_bus_order_head where  order_type in (1,2,17) and order_status=1 and  trans_date>DATE_SUB(CURDATE(), INTERVAL 3 MONTH) GROUP BY cust_id HAVING COUNT(1) > 0;


update mt_prod_service as a
INNER JOIN(
select t1.id as id from mt_prod_service as t1 where t1.end_date >= '2022-06-30 00:00:00' and t1.end_date <= concat('2022-06-30', ' 23:59:59')
) as b
on a.id=b.id
set a.end_date='2023-06-30 00:00:00'
 

 

查询插入

语句形式为:Insert into Table2(field1,field2,...) select value1,value2,... from Table1

或者:Insert into Table2 select  *  from Table1

 

 

SELECT * from  t_bank_trade_record  where payment_order_no='10UM202106181045142089534722' for update;

update t set a = a + 100 where a = 4;

查询一年

select * FROM bl_user_settlement_record io where YEAR(io.create_time)=YEAR(NOW());

查询1~12个月

SELECT * FROM bl_user_settlement_record io where MONTH(io.create_time)=8

查询1~12 个月

select SUM(t1.user_consume_amount) as totalPrice
from bl_user_settlement_record t1
where t1.business_id=#{businessId} and date_format(t1.create_time,'%Y-%m')=#{date}

 

查询10天为提货订单

select id,
FROM_UNIXTIME(pay_time) as paytime ,
date_add(FROM_UNIXTIME(pay_time), INTERVAL 10 day) as pay10time,
NOW() as nowtime
from bl_order
where promote_state=1 and order_type=1 and
date_add(FROM_UNIXTIME(pay_time), INTERVAL 10 day)<= now()
order by create_time desc

 
 
 
select COUNT(DISTINCT merchant_uuid)
from merchants_track_record
where record_type =2 and track_user='125565696128418441'
 
select count(1) from (
select merchant_uuid
from merchants_track_record
where record_type =2 and track_user='125565696128418441'
GROUP BY merchant_uuid
) as t1
 
获取id 逗号分隔

select
GROUP_CONCAT(id)
from sunxing_work_order.task
where type = 'normal' #工单
and task_template_id = 100 # 审核中
and task_type_id = 101
and status = 'Process'
and create_time <'2020-07-16 00:00:00'

 
-- mysql的最大连接数:默认为 100
 
-- mysql的增删改查
 
-- mysql统计各个字段(case when 用法 注:也可以使用其他的)
 
select (case when a='1' then 1 else 0 end) as'counta' from table;
-- mysql 的日期转字符串 Date ——> String
 
SELECT count(1) as t1,user_id FROM `user`.`t_user_rebate_history` WHERE `rebate_type_name` = '用户福利'  GROUP BY user_id HAVING t1>30    ORDER BY `create_time` DESC 
 
查询这个月每天记录
select date_format(create_time, '%Y-%m-%d') dat, count(*),
sum(work_indicator) as totalWorkIndicator,
sum(work_compelete_indicator) as totalWorkCompeleteIndicator
from merchants_work_indicator_history
WHERE work_type =#{recordType}
and DATE_FORMAT(create_time,'%Y%m') = DATE_FORMAT(CURDATE(),'%Y%m')
group by date_format(create_time, '%Y-%m-%d')
order by dat asc;
 
 
使用的函数:DATE_FORMAT(date,format)
date:需要转换的日期
format:格式化的样式
DATE_FORMAT(now(),"%Y-%m-%d %T")
 
-- mysql 的字符串转日期 String ——>Date
 
使用的函数:STR_TO_DATE(str,format)
str:字符形式的日期
format:格式化样式
STR_TO_DATE('1992-04-12',"%Y-%m-%d")

 

-- mysql的分页问题
 
查询第1条到第10条的数据的sql是:select * from table limit 0,10;
对应我们的需求就是查询第一页的数据:select * from table limit (1-1)*10,10;
 
select * from table limit (start-1)*pageSize,pageSize;
其中start是页码,pageSize是每页显示的条数。
 
-- mysql 联合索引命中问题
 
前导模糊查询不能使用索引。
负向条件查询不能使用索引(!=<>not innot existsnot like 等)。

 

 

https://www.cnblogs.com/cxiaocai/p/11594151.html

SHOW STATUS LIKE '%Connection%';

SHOW VARIABLES LIKE '%max_connections%';

SHOW PROCESSLIST;

lock table student write; 加表锁

show open tables;查看表状态(是否被加锁)

 

 内有有一个列为In_use为1的即为已有锁存在。

 

 解锁表:unlock tables;

 

show status;

+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 58    |
| Threads_connected | 57    |   ###这个数值指的是打开的连接数
| Threads_created   | 3676  |
| Threads_running   | 4     |   ###这个数值指的是激活的连接数,这个数值一般远低于connected数值

 

数据库性能优化

1.建立索引

2.多表关联进行单表查询

3.数据查询where条件进行从右先过滤大的条件

5、数据库主从分离,读写分离,降低读写针对同一表同时的压力,至于主从同步,MySQL有自带的binlog实现 主从同步;

 

数据处理

INSERT INTO city_config(city_id,city_name,city_code,city_status) SELECT cityid,city,cityid,1 FROM t_cities where city='乌鲁木齐市'
 

SELECT
count(1)
FROM
hzc.usr_profiles as u
LEFT JOIN hzc.tblorder AS t ON u.id=t.profile_id
where
u.mobile in (SELECT
a.mobile
FROM
opt.opt_user_travel_info as a) AND t.OrderID IS NULL or t.payment_status in(3,4);

 
--         SELECT  count(TIMESTAMPDIFF(HOUR,now(),DATE_ADD(election_time, INTERVAL 15 DAY)))  as  hours
-- from apply_city_master
select count(id) from apply_city_master where HOUR(timediff(now(), expiry_time)) &lt;= 24 and apply_status=2

SELECT order_num,SUM(quantity*item_price) AS ordertotal FROM orderitems GROUP BY order_num HAVING SUM(quantity*item_price) >=50 ORDER BY ordertotal;

SELECT * FROM hzc.tblorder where contact_mobile in (SELECT a.mobile FROM opt.opt_user_travel_info as a limit 0,13369)
select * from hzc.vas_cdl_order_details where (last_ename='test' or first_ename='hzc') order by CreateDtTm desc
 

非前导则可以使用索引

select name from user where name like 'zhangsan%'

SELECT
a.order_no
FROM
hzc_tmp_201807201934.vas_orders a
WHERE
a.vas_order_type = 'C'
AND a.order_date BETWEEN '2018-07-20' AND '2018-07-21'
AND a.order_status = 1
AND a.payment_status IN (0 , 2)
AND NOT EXISTS( SELECT
1
FROM
hzc.vas_orders
WHERE
order_no = a.order_no)

 
数据库引擎
MySQL中myisam与innodb的区别,至少5点
InnoDB是基于索引来完成行锁
 
  • 1>.InnoDB支持事物,而MyISAM不支持事物
  • 2>.InnoDB支持行级锁,而MyISAM支持表级锁
  • 3>.InnoDB支持MVCC, 而MyISAM不支持
  • 4>.InnoDB支持外键,而MyISAM不支持
  • 5>.InnoDB不支持全文索引,而MyISAM支持。
  1. from (注:这里也包括from中的子语句)
  2. join
  3. on
  4. where
  5. group by(开始使用select中的别名,后面的语句中都可以使用)
  6. avg,sum.... 等聚合函数
  7. having
  8. select
  9. distinct
  10. order by
  11. limit

 

1. 怎么验证 mysql 的索引是否满足需求?

使用 explain 查看 SQL 是如何执行查询语句的,从而分析你的索引是否满足需求。

 explain 语法:explain select * from table where type=1。

 

SELECT t1.id,t1.city_id,t1.city_name,t1.create_time,
GROUP_CONCAT(t2.mobile)as mobile,

TIMESTAMPDIFF(DAY,now(),min(t2.expiry_time)),

GROUP_CONCAT(t2.expiry_time)as mobile,
min(t2.expiry_time) as mindate,
t1.city_status,
t1.is_citymaster,
(
CASE
WHEN (TIMESTAMPDIFF(DAY,now(),min(t2.expiry_time))>=10) THEN 10
WHEN (t1.is_citymaster=1 &&t1.is_citydeputy1=1 && t1.is_citydeputy2=1) THEN 0
ELSE 1
END
)
AS masterStatus
from city_config as t1
left join apply_city_master as t2
on t1.id=t2.city_id
where t2.apply_status=2
GROUP BY t1.city_id
ORDER BY t2.city_type
 
select * from income_details
where user_id=1067
and city_id=250
and city_type=2
and apply_status=1
and create_time>='2019-07-22 23:00:00'
and create_time<='2019-08-06 23:00:00'
 
:="INSERT INTO student(id,name,age) VALUES("&A2&",'"&B2&"','"&C2&"')" 
 
 
SELECT `userspk`.`avatar` AS `user_avatar`, 
`a`.`user_id`, 
`a`.`answer_record`, 
 MAX(`score`) AS `score`
FROM (select * from pkrecord  order by score desc) as a 
INNER JOIN `userspk` AS `userspk` 
ON `a`.`user_id` = `userspk`.`user_id`
WHERE `a`.`status` = 1 
AND `a`.`user_id` != 'm_6da5d9e0-4629-11e9-b5f7-694ced396953' 
GROUP BY `user_id`
ORDER BY `a`.`score` DESC 
LIMIT 9;
 
//不使用子查询
SELECT `userspk`.`avatar` AS `user_avatar`, 
`pkrecord`.`user_id`, 
`pkrecord`.`answer_record`, 
`pkrecord`.`id`, 
 MAX(`score`) AS `score`
FROM pkrecord
INNER JOIN `userspk` AS `userspk` 
ON `pkrecord`.`user_id` = `userspk`.`user_id`
WHERE `pkrecord`.`status` = 1 
AND `pkrecord`.`user_id` != 'm_6da5d9e0-4629-11e9-b5f7-694ced396953' 
GROUP BY `user_id`
ORDER BY `pkrecord`.`score` DESC 
LIMIT 9;
 
="insert into hzc_activity.app_layer_country_default_city(country,city_id) values ('"&A1&"',"&B1&");"


ALTER TABLE `hzc`.`mkt_coupon_policies`
ADD COLUMN `isRemind` BIT(1) NULL DEFAULT b'0' AFTER `coupon_policy_car_group_id`;
 
ALTER TABLE `hzc`.`ref_drv_coupon_label`
ADD COLUMN `channel` VARCHAR(200) NULL DEFAULT NULL AFTER `country_id`;
 

MySql查询某一天的数据

select SUM(actual_deduction_price) from income_details where user_id=20 and create_time>='2019-07-25 00:00:00' and create_time<='2019-07-25 23:59:59';


select SUM(actual_deduction_price) from income_details where user_id=20 and create_time between '2019-07-25 00:00:00' and '2019-07-25 23:59:59';


SELECT SUM(actual_deduction_price) from income_details where user_id=20 and create_time > '2019-07-25' and create_time < '2019-07-26';


SELECT SUM(actual_deduction_price) from income_details where user_id=20 and (datediff(create_time,'2019-07-25')=0);

查询当前时间在这个范围内
SELECT * from mt_org_employee_transfer where NOW() between begin_date and end_date

 

 
create sequence seq_USERS_id start with 1 increment by 1;
 
insert into users values (seq_USERS_id.nextval,'张三','1','2');
 

 
select * from user where name in (select name from user group by name having count(1) > 1);
 
SELECT * FROM user AS a WHERE EXISTS ( SELECT 1 FROM user AS b WHERE a.name = b.name GROUP BY name HAVING COUNT(1) > 1 )

 

SELECT IFNULL(l1.wechat_nick_name, l2.mobile) AS wechatName, l1.wechat_head_img_url AS wechatImg FROM hzc.acy_oldwithnew_bundling t1 left JOIN hzc.acy_users l1 ON t1.to_profile_no = l1.profile_no left JOIN hzc.usr_profiles l
 
select * from user where id in( select min(id) from user where name = 'Java3y' and pv = 20 and time='7-25' group by name,pv,time; )
 
select name,time,sum(pv) as pv from xxx_table where name = 'Java3y' group by name,time
 
 
昨天
SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) <= 1
7天
SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(时间字段名)
30天
SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(时间字段名)
本月
SELECT * FROM 表名 WHERE DATE_FORMAT( 时间字段名, '%Y%m' ) = DATE_FORMAT( CURDATE( ) , '%Y%m' )
上一月
SELECT * FROM 表名 WHERE PERIOD_DIFF( date_format( now( ) , '%Y%m' ) , date_format( 时间字段名, '%Y%m' ) ) =1
 
select supplier,count(id) from xxx_table where sendtime >= timestamp '2019-06-01'
 

 

 

 

索引:B+,B-,全文索引
Mysql的索引是一个数据结构,旨在使数据库高效的查找数据。
常用的数据结构是B+Tree,每个叶子节点不但存放了索引键的相关信息还增加了指向相邻叶子节点的指针,这样就形成了带有顺序访问指针的B+Tree,做这个优化的目的是提高不同区间访问的性能。
什么时候使用索引:

经常出现在group by,order by和distinc关键字后面的字段

经常与其他表进行连接的表,在连接字段上应该建立索引

经常出现在Where子句中的字段

经常出现用作查询选择的字段

1)首先我们可以用EXPLAIN或DESCRIBE(简写:DESC)命令分析一条查询语句的执行信息。

DESC SELECT * FROM `user`

2)优化子查询

在MySQL中,尽量使用JOIN来代替子查询。因为子查询需要嵌套查询,嵌套查询时会建立一张临时表,临时表的建立和删除都会有较大的系统开销,而连接查询不会创建临时表,因此效率比嵌套子查询高。

3)使用索引

索引是提高数据库查询速度最重要的方法之一,使用索引的三大注意事项包括:

LIKE关键字匹配'%'开头的字符串,不会使用索引;

OR关键字的两个字段必须都是用了索引,该查询才会使用索引;

使用多列索引必须满足最左匹配。

4)分解表

对于字段较多的表,如果某些字段使用频率较低,此时应当将其分离出来从而形成新的表。

5)中间表

对于将大量连接查询的表可以创建中间表,从而减少在查询时造成的连接耗时。

6)增加冗余字段

类似于创建中间表,增加冗余也是为了减少连接查询。

7)分析表、检查表、优化表

分析表主要是分析表中关键字的分布;检查表主要是检查表中是否存在错误;优化表主要是消除删除或更新造成的表空间浪费。

分析表: 使用 ANALYZE 关键字,如ANALYZE TABLE user

 

select t1.id,t1.city_name,GROUP_CONCAT(t2.mobile) as mobile,t2.city_type,t2.apply_status
from city_config as t1
left join apply_city_master as t2
on t1.id=t2.city_id
where t2.apply_status=4
and t1.id=363
GROUP BY city_type
ORDER BY t2.create_time

 

 

select  GROUP_CONCAT(t2.mobile) as mobile,t2.city_type from  apply_city_master as t2 where  t2.city_id=363  and  t2.apply_status=4  GROUP BY t2.city_type ORDER BY t2.create_time


select

(
CASE
WHEN (a1.city_type=1) THEN a1.mobile
END
)AS citymaster,

 

(
CASE
WHEN (a1.city_type=2) THEN a1.mobile
END
)AS citymaster2,

(
CASE
WHEN (a1.city_type=3) THEN a1.mobile
END
)AS citymaster3

from
(
select GROUP_CONCAT(t2.mobile) as mobile,t2.city_type from apply_city_master as t2 where t2.city_id=363 and t2.apply_status=4 GROUP BY t2.city_type ORDER BY t2.create_time
) as a1

 


select
(
CASE
WHEN (a1.city_type=1) THEN a1.mobile
WHEN (a1.city_type=2) THEN a1.mobile
WHEN (a1.city_type=3) THEN a1.mobile
END
)AS citymaster
from
(
select GROUP_CONCAT(t2.mobile) as mobile,t2.city_type from apply_city_master as t2 where t2.city_id=363 and t2.apply_status=4 GROUP BY t2.city_type ORDER BY t2.create_time
) as a1

 

 

 

 

 

 

 

 

 
posted @ 2019-07-24 10:51  小蚊子大人KN  阅读(469)  评论(0编辑  收藏  举报