一、格式
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 >= CONCAT(#{startTime}, ' 00:00:00')
//从00点00分00秒开始查询
</if>
<if test="endTime != null and endTime != ''">
and cancellation_time <= CONCAT(#{endTime}, ' 23:59:59')
//到该日期的23点59分59秒结束
</if>
或
<if test="startTime != null and startTime != ''">
and pu.purchase_time >= #{startTime}
</if>
<if test="endTime != null and endTime != ''">
and pu.purchase_time <= 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数据库开启远程链接
(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
返回结果:
| saleCount | saleYmd | customerCount | saleYmd1 |
|---|---|---|---|
| 3 | 2019-07-30 | 2 | 2019-07-30 |
| 4 | 2019-08-21 | 1 | 2019-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

237





