常用Sql语句

如果有就更新,没有就插入一条

先来一条简单的

/*
table_1:要更新的表
field_1...:要更新的字段, 字段中必须含有 UNIQUE 索引的字段,因为 ``ON DUPLICATE KEY``要依靠其工作
value_1...:执行Insert时要插入的值,即没有记录时执行的部分
field_target = value_target:当有记录存在时,将 field_target 字段值更新为 value_target,允许多个字段和值存在
*/
INSERT INTO table_1 ( field_1, field_2 ) VALUES (value_1, value_2) ON DUPLICATE KEY UPDATE field_target = value_target

当满足 B 表某些条件时,就插入或更新 A 表中的记录

INSERT INTO user_table ( user_id, access_token )
SELECT ad.user_name, 'dcei32kad23-0-sdfjio' 
FROM admin_table AS ad 
WHERE ad.user_name = 'petty' AND ad.user_password = '123456' ON DUPLICATE KEY UPDATE access_token = 'vbmkaslwe'

上面意思是:找到 admin_table 表中名字等于petty并且密码等于123456的记录,如果有就更新 user_talbe 表中 user_id = user_name 的那条记录的 access_token,使其值更改为 'vbmkaslwe',如果没有 user_id = user_name 的记录的话,就往 user_table 中插入一条新记录,该记录的 user_id 使用 ad.user_name 作为值,该记录的 access_token 使用 'dcei32kad23-0-sdfjio' 作为值。

多个表选择+条件+排序+分组

SELECT at.object_id AS id, at.title, at.time, at.time, at.`status`, COUNT(ae.user_id) AS `count` 
FROM table_1 AS at
LEFT JOIN table_2 AS ae 
ON ae.activity_id = at.object_id 
WHERE at.deleted = FALSE  
AND EXISTS(SELECT id FROM table_3 WHERE token = '' AND user_id = '' AND expires > TIMESTAMPDIFF(SECOND, allocate_time, now())) 
GROUP BY at.id 
ORDER BY at.time DESC 
LIMIT 0, 10

上面的意思是:输出 xxx 列,从 table_1和table_2,关联条件是 table_2 中多个记录的 id 值要在 table_1 中存在(table_1:table_2=1:N),选择条件是 table_1 中没删除的 并且是满足 table_3 中某条件的那些个记录。把这些个记录按 table_1 的id分组(这样table_1的就不会重复),按 table_1 的时间倒序,这些记录只输出前10个

复杂插入

建立一个简单的联系数据:
mobile_number char(11)、mobile_province nvarchar(50)、mobile_area nvarchar(200)、mobile_type nvarchar(50)
数据来自另一个数据表,用 sql 语句将原表数据“插入”到新表,插入中解决几个小问题:
mobile_number 数据来自源表中两个字段,需要 + 一下,但 + 了之后长度可能也不足 11 位;
mobile_province 和 mobile_area 来自源表中的一个字段,以1个空格分隔,前面部分作为province后面作为area;

USE mobile_test
DELETE FROM mobile_phone_distribute
go

INSERT INTO mobile_phone_distribute (mobile_number,mobile_province,mobile_area,mobile_type)
SELECT Dm_Mobile.MobileNumber+Dm_Mobile.AreaCode,SUBSTRING(Dm_Mobile.MobileArea,0,CHARINDEX(' ',dm_mobile.MobileArea)),SUBSTRING(DM_MOBILE.MobileArea,CHARINDEX(' ',dm_mobile.MobileArea)+1,LEN(dm_mobile.mobilearea)-CHARINDEX(' ',dm_mobile.MobileArea)),DM_MOBILE.MobileType
FROM Dm_Mobile
SELECT * FROM mobile_phone_distribute
SELECT * FROM mobile_phone_distribute WHERE LEN(mobile_number)<11
GO

解决新表中 mobile_number 字段不足 11 位,后面填充'X'

UPDATE mobile_phone_distribute
--SET mobile_number = SUBSTRING(CONCAT(mobile_number,'XXXXXX'),0,11)
SET mobile_number=LEFT(rtrim(mobile_number)+cast('XXXXXXXXX' as varchar(20)),11)
WHERE LEN(mobile_number)<11
SELECT * FROM mobile_phone_distribute
GO
posted @ 2018-09-25 14:03  试试手气  阅读(174)  评论(0编辑  收藏  举报