【mysql 语句集合】

一、格式

SELECT
查询属性
FROM
表名
LEFT JOIN 表名 ON 连接条件
WHERE
查询条件
GROUP BY
分组属性 或分组属性1,分组属性2
ORDER BY
排序属性1,排序属性2

二、可用函数以及使用方法

1、查询属性里面可用函数

(1)日期格式化函数

  • DATE_FORMAT( bill_time, ‘%Y-%m-%d’ ) billTime 返回给前台年-月-日的格式

  • DATE_FORMAT(sale_time,‘%Y-%m-%d %H:%i’) AS saleTimeStr 返回给前台年-月-日-时-分的格式

  • DATE_FORMAT(sale_time,‘%Y-%m-%d %H:%i:%s’) AS saleTime 返回给前台年-月-日-时-分-秒的格式

(2)结果为空时进行赋值

  • IFNULL(manageMoney,0)
  • IFNULL( COUNT(*), 0 )

(3)基本聚合函数 聚合函数一般和分组(GROUP BY)一起用根据某个属性进行汇总

  • SUM( deposit )
  • COUNT(*)
  • COUNT(DISTINCT *) 错误语句
  • COUNT(DISTINCT id) 返回彼此不相同非null得行数 不存在返回0 只使用DISTINCT是不过滤null的
  • COUNT(某列) 返回该列不为null的行数 不存在返回(bigint)0 通常使用这种方式来判断是否有满足条件的数据
  • COUNT(*)直接统计所有行不会过滤null
    COUNT(属性列1,属性列2) 错误写法 他只能作用在单列
  • MAX(字段名)
  • MIN(字段名)
  • AVG(字段名)
  • CONCAT(xx,xx)第一个字段与第二个字段拼接 也可拼接多个字段

(4)直接赋值给某属性

0.00 AS printMoney 或 “打印服务费” AS optionStyle

(5)可在查询的属性中直接进行加减运算

  • aa.zheng - aa.fu AS nowNum 返回给前台的数为这两个数的差
  • -aa.fu AS nowNum 返回给前台的数为该数的相反数
  • CONCAT(‘挂失日期:’,DATE_FORMAT(rl.report_time,‘%Y-%m-%d %H:%i:%s’),’ 理由:',rl.report_loss_reason) AS reportLossReason
    拼接字段进行返回

(6)CASE … WHEN …END

CASE cc.cancel_type
WHEN 1 THEN '销户退卡'
WHEN 2 THEN '遗失卡退卡'
END AS cancelTypeName

2.XxxMapper.xml中组装查询条件

(1)中获取前端传来数据

ep_id = #{epId}

(2)对条件进行判断性添加 >= 不能直接写成<=

不等条件

<if test="startTime != null and startTime != ''">
    and cancellation_time &gt;= CONCAT(#{startTime}, ' 00:00:00') 
    //从00点00分00秒开始查询
</if>
<if test="endTime != null and endTime != ''">
    and cancellation_time &lt;= CONCAT(#{endTime}, ' 23:59:59') 
    //到该日期的23点59分59秒结束
</if>

<if test="startTime != null and startTime != ''">
  and pu.purchase_time &gt;= #{startTime}
</if>
<if test="endTime != null and endTime != ''">
  and pu.purchase_time &lt;= ADDDATE(#{endTime},1) 
  //结束的那天加一天不然会查不到结束那天的信息
</if>

相等条件

<if test="billNo != null and billNo != ''">
  and sa.bill_no = #{billNo}
</if>

模糊查询

<if test="idNumber != null and idNumber != ''">
    AND a.id_number like CONCAT('%',#{idNumber},'%')
</if>

(3)limit

select * from table limit m,n

其中m是指记录开始的index,从0开始,表示第一条记录
n是指从第m+1条开始,取n条。

select * from tablename limit 2,4

从下标2开始取4条 即取出第3条至第6条,4条记录

(4)GROUP BY

  • GROUP BY X意思是将所有具有相同X字段值的记录放到一个分组里
  • GROUP BY X, Y意思是将所有具有相同X字段值和Y字段值的记录放到一个分组里。
    如:统计每个用户(Buyer)在每种商品(Product)上总共花了多少钱
SELECT Product,Buyer, SUM(Spending)
FROM `Order`
GROUP BY Product, Buyer

(5)ORDER BY xxx ASC|DESC( 升序|降序) 默认升序

ORDER BY X
ORDER BY X, Y

(6)mysql8.0出现which is not functionally dependent on columns in GROUP BY clause; this is incompatible wi 使用mysql聚合函数ANY_VALUE(field) 用于包含非分组字段的出现

解决该问题的方式,点击这里查看

(7)mysql数据库开启远程链接

mysql 开启外连

MySQL 开启远程连接

如何开启MySQL远程访问权限

(8)Sql中获取最新数据

当分组查询后记录中有多条时,如何获取最新的一条记录
Sql如何从表中取到最新的数据

(9)

  • 用join 拼接成一行,在一行记录中返回同表中不同纬度汇总结果
SELECT
 * 
FROM
 (
	SELECT
	 count( a.id ) AS saleCount,
	 a.saleYmd 
	FROM
	 (
		SELECT
		 DATE_FORMAT( a.sale_date, '%Y-%m-%d' ) AS saleYmd,
		 a.id 
		FROM
		 vegetable_sale a
		 LEFT JOIN customer b ON a.customer_code = b.customer_code 
	 ) a 
	GROUP BY
	 a.saleYmd 
 ) d
 JOIN (
	SELECT
	 count( a.customer_code ) AS customerCount,
	 a.saleYmd 
	FROM
	 (
		SELECT DISTINCT
		 DATE_FORMAT( a.sale_date, '%Y-%m-%d' ) AS saleYmd,
		 a.customer_code 
		FROM
		 vegetable_sale a
		 LEFT JOIN customer b ON a.customer_code = b.customer_code 
	 ) a 
	GROUP BY
	 a.saleYmd 
 ) e ON d.saleYmd = e.saleYmd

返回结果:

saleCountsaleYmdcustomerCountsaleYmd1
32019-07-3022019-07-30
42019-08-2112019-08-21
  • 统计符合条件的数量
SELECT
			COUNT(ma.id)AS meatApproachCount
		FROM
			meat_approach ma
		LEFT JOIN product p ON ma.link_product_id = p.code
		AND ma.ep_id = p.ep_id
		WHERE
			ma.delete_flg = '0'
-- AND p.type = 2
		AND ma.ep_id = '310113003'
		AND ma.approach_date >= '2019-08-01'
		AND ma.approach_date < '2019-08-31'
  • 节点每月肉菜进场数据上报量基准为肉类备案经营户数量×30+蔬菜备案经营户数量×90,得分计算公式为, 该项最高5分。
SELECT
	m.meatApproachCount,
	v.vegetableApproachCount,
	m.meatApproachCount + v.vegetableApproachCount AS ApproachCount,
	mc.meatCustomerCount,
	mc.vegCustomerCount,
	mc.meatCustomerCount * 30 + mc.vegCustomerCount * 90 AS CustomerCount,
(m.meatApproachCount + v.vegetableApproachCount) / (mc.meatCustomerCount * 30 + mc.vegCustomerCount * 90) * 5 AS total
FROM
	(
		SELECT
			COUNT(ma.id)AS meatApproachCount
		FROM
			meat_approach ma
		LEFT JOIN product p ON ma.link_product_id = p.code 		
		WHERE
			ma.delete_flg = '0'
		AND p.type = '2'
		AND ma.ep_id = '310113003'
		AND ma.approach_date >= '2019-08-01'
		AND ma.approach_date < '2019-08-31'
	)m
JOIN(
	SELECT
		COUNT(va.id)AS vegetableApproachCount
	FROM
		vegetable_approach va
	LEFT JOIN product p ON va.link_product_id = p.code
	WHERE
		va.delete_flg = '0'
	AND p.type = '1'
	AND va.ep_id = '310113003'
	AND va.approach_date >= '2019-08-01'
	AND va.approach_date < '2019-08-31'
)v
JOIN(
	SELECT
		pig_amount AS meatCustomerCount,
		vegetable_amount AS vegCustomerCount
	FROM
		enterprise 
	WHERE
		delete_flg = '0'
	AND ep_id = '310113003'
)mc
  • 把一个表(sale)数据插入到另外一个属性更多得表(sale_new)中 语句
INSERT INTO sale_new (
	id,
	ep_id,
	t_id,
	supermarket_flg,
	purchase_time,
	sale_date,
	t_number,
	batch_no,
	product_id,
	quar_cert_start,
	quantity,
	weight,
	price,
	money,
	market_price,
	promotion_price,
	promotion_days,
	report_flg,
	create_user,
	create_time,
	update_user,
	update_time,
	delete_flg,
	third_flg
)
 SELECT
	id,
	ep_id,
	t_id,
	supermarket_flg,
	purchase_time,
	sale_date,
	t_number,
	batch_no,
	product_id,
	quar_cert_start,
	quantity,
	weight,
	price,
	money,
	market_price,
	promotion_price,
	promotion_days,
	report_flg,
	create_user,
	create_time,
	update_user,
	update_time,
	delete_flg,
	third_flg
FROM
	sale
  • 更新表中与其他表关联得数据
update sale_new os
 left join product p on os.product_id = p.code
 LEFT JOIN purchase pu ON pu.delete_flg = 0 AND pu.number = os.t_number
 LEFT JOIN supplier su ON su.delete_flg = 0 AND pu.supplier_id = su.`code`
 LEFT JOIN brand b ON b.delete_flg = 0 AND pu.brand_id = b.`code`
 LEFT JOIN division d ON d.delete_flg = 0 AND pu.division_id = d.`code`
 set 
os.product_name = p.name,
os.product_type = p.type,
os.customer_code = pu.supplier_id,
os.customer_name = su.name,
os.brand_code = pu.brand_id,
os.brand_name = b.name,
os.division_code = pu.division_id,
os.division_name = d.name;

三、Mysql 数据库优化

1、查询优化

(1)添加索引

SHOW INDEX FROM user; 查询user 表中的索引

2、order by 优化

复合索引(多列索引)中的一个或多个列进行排序。要遵循最左前缀匹配原则。如果是使用复合索引中的多个列进行排序,这些列排序的顺序要么都是升序,要么都是降序,否则无法使用索引加速排序操作

通过 EXPLAN 可分析该查询的情况 using filesort 代表没有使用索引进行查询

3、大批量转储sql,比较快得方法

SELECT * FROM sale_new3 INTO OUTFILE 'sale_new.text'
LOAD DATA INFILE 'sale_new.text' INTO TABLE sale_new

4、检测sql执行快慢及列表

浏览器中输入以下链接可查看sql 动态执行的快慢
http://127.0.0.1:8080/{projectName}/druid/index.html

在这里插入图片描述

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值