1、按照某一字段分组查询:
GROUP BY
SELECT 字段名1,字段名2,字段名3` FROM 表名 GROUP BY 字段名1;
SELECT SUM(f_total),f_customer_id,f_sale_user_id,f_quantity
FROM t_order JOIN t_order_detail ON t_order.f_order_id = t_order_detail.f_order_id
GROUP BY f_customer_id,f_sale_user_id
2、修改字段默认值语法:
default
alter table 表名 alter column 字段名 set default 默认值;(若本身不存在则可以直接设定)
3、多表连接查询:
(1)INNER JOIN ON(相等连接或内连接)
只显示符合条件的记录.
select
m.name,
m.productId as productId,
m.merchantId as merchantId,
m.code as code,
p.name as unitName,
b.name as codeName
FROM
t_merchant_product AS m
INNER JOIN t_bas_pack_unit AS p INNER JOIN t_bas_product AS b
ON m.packUnitId = p.packUnitId and m.code = b.code
(2)LEFT JION ON(左连接)
a表与b表连接,以左表为基准(左表全部显示),右表查询条件满足的才显示(此处是a.Id=b.Id),不符条件的补齐显示null
SELECT * FROM t_action a
LEFT JOIN t_base b
ON a.Id =b.Id
连接前
a表 b表
id name id code
1 张 1 005
2 刘 3 009
左连接后
id name id code
1 张 1 005
2 刘 null null
(在sqlyog试了两表字段名相同连接后,新表就会有两个相同字段)
(3)RIGHT JION ON(右连接)
a表与b表连接,以右表为基准(右表全部显示),右表查询条件满足的才显示(此处是a.Id=b.Id),不符条件的补齐显示null
原理同左连接,此处不赘述。
4、多表联合新增:
UPDATE t_action AS a,t_base AS b
SET b.code='9527'
WHERE a.id = b.id
5、多表联合删除:
DELETE c,d FROM `t_base_equipment` AS c LEFT JOIN `t_internet_things_equipment` AS d
ON c.`f_equipment_id`=d.`f_equipment_id`
WHERE c.`f_relation_id`=56
DELETE c,d,a,b FROM `t_farming` AS c
LEFT JOIN `t_farming_evaluate` AS d ON c.`f_farming_id`=d.`f_farming_id`
LEFT JOIN `t_farming_material` AS a ON c.`f_farming_id`=a.`f_farming_id`
LEFT JOIN `t_farming_operator` AS b ON c.`f_farming_id`=b.`f_farming_id`
WHERE c.f_enterprise_id = 1
错误写法:
DELETE FROM `t_base_equipment` AS c LEFT JOIN `t_internet_things_equipment` AS d
ON......
会报错:Unknown table 't_base_equipment' in MULTI DELETE
6、在同一个delete标签下写多个sql语句:
<delete id="clean" parameterType="String">
DELETE FROM Table1
WHERE f_enterprise_id = #{enterpriseId,jdbcType=VARCHAR};
DELETE FROM Table2
WHERE f_enterprise_id = #{enterpriseId,jdbcType=VARCHAR};
</delete>
用“;”相隔
7、两个日期相减:
SELECT
a.f_variety_id,
a.f_variety_spec_id,
a.f_expiration_date,
DATEDIFF(a.f_expiration_date,CURDATE()) AS countdown
FROM t_document_detail AS a
INNER JOIN t_variety_spec AS b ON a.f_variety_spec_id = b.f_variety_spec_id
GROUP BY a.f_variety_id,a.f_variety_spec_id
ORDER BY countdown ASC
语法:DATEDIFF(a.f_expiration_date, CURDATE( ))
其中注意 where、group by、order by 【点击查看顺序】
8、重名验证:
<!-- 编辑时重名验证 (排除自己的ID)-->
<select id="selectUpdateName" parameterType="com.adg.bean.CustomerEntity" resultType="int">
select Count(*) from t_customer
where f_name = #{name,jdbcType=VARCHAR}
AND f_customer_id != #{customerId,jdbcType=INTEGER}
</select>
查询是否存在除了自己以外的同名数据。
9、having:

查询表中各科分数都大于或等于80的人的姓名:
方法1:
SELECT NAME FROM `test`
GROUP BY NAME
HAVING NAME NOT IN (SELECT NAME FROM test WHERE score <80)
方法2:
SELECT NAME FROM `test`
GROUP BY NAME
HAVING MIN(score)>=80
方法3:
SELECT NAME FROM `test`
GROUP BY NAME
HAVING COUNT(score)=SUM(CASE WHEN score>=80 THEN 1 ELSE 0 END)
方法3中,分解一下可以看到:

本文介绍SQL中的高级查询技术,包括按字段分组、修改字段默认值、多表连接查询、多表联合操作、日期计算、重名验证及使用HAVING子句等。通过具体实例帮助读者掌握这些实用技巧。
174万+

被折叠的 条评论
为什么被折叠?



