一些常用的sql方法
**sql基础语法
SELECT
查询的字段
FROM
表名
WHERE
条件
GROUP BY
分组字段
HAVING
分组后的条件
ORDER BY
排序
LIMIT
分页
1、使用python从mysql中读取datetime字段后,会转为python-datetime对象,使用mysql的DATE_FORMAT
方法可以转为字符串。
cur.execute("SELECT DATE_FORMAT(date_field, '%%Y-%%m-%%d %%H:%%i:%%s') AS new_date_field FROM table;")
2、删除重复的数据,保留最大id
DELETE
FROM
user
WHERE
id IN (
SELECT
a.id
FROM
(
SELECT
MIN( `id` ) `id`
FROM
user
WHERE
`type` IS NOT NULL
GROUP BY
`username`,
`phone`,
`email`
HAVING
COUNT( * ) > 1
) a
);
3、根据其中的unique或者主键字段,插入或者更新该数据(如果team_id不存在则插入, 否则更新name_j字段)
INSERT INTO
`team` ( `team_id`, `name_j` )
VALUES
( % s,% s )
ON DUPLICATE KEY UPDATE
`name_j` = VALUES( `name_j` )
4、 根据 team_id和kind 是否插入 数据
INSERT INTO `team` ( `team_id`, `name_j`, `name_e`, `kind`) SELECT
%s,%s,%s,%s
FROM
DUAL
WHERE
NOT EXISTS ( SELECT * FROM `team` WHERE team_id=%s AND kind=%s);
5、 创建触发器, 如果 修改了 name_j ,则把team_time
修改为现在时间
show triggers; -- 所有触发器
CREATE TRIGGER `触发器的名字`
before UPDATE ON `table_name` FOR EACH ROW
begin
IF old.`name_j` <> new.`name_j` THEN
SET new.`team_time`=now();
END IF;
END;
-- 触发器中设置多个字段,住:MySQL5后不支持返回结果集,需要INTO @变量
SELECT a,b INTO @A,@B FROM table_a;
SET new.a=@A,new.b=@B;
DROP TRIGGER 触发器名字; -- 删除触发器
6、 CASE WHEN ... THEN 1 ELSE 0 END
CASE
WHEN 条件 THEN 结果
WHEN 条件 THEN 结果
ELSE 结果
END
-- 函数中使用:
SUM(CASE WHEN age=18 AND type="beauty" THEN 1 ELSE 0 END) AS beauty
7、返回返回数据的行数,用于分页查询, 两种方法
-- COUNT分页查询,两次查询,效率较慢。
SELECT COUNT(*) FROM table_name WHERE `field` = 1;
-- 计算出总页数
SELECT COUNT(*) FROM table_name WHERE `field` = 1 LIMIT page;
-- 使用SQL_CALC_FOUND_ROWS分页查询, 一次查询,效率快。
SELECT SQL_CALC_FOUND_ROWS * FROM table_name WHERE `field` = 1 LIMIT 10;
-- SQL_CALC_FOUND_ROWS记录当前查询的行数,不包含LIMIT。
SELECT FOUND_ROWS();
-- 执行后拿到SQL_CALC_FOUND_ROWS记录的数值。
8、关联查询中的动态条件
-- IF中,可以嵌套多个IF
SELECT
*
FROM
`table1` t1
LEFT JOIN `table2` t2 ON t2.pid=IF(t1.age=18, `t1`.`pid1`, `t1`.`pid2`)
9、设置tinyint类型 为无符号
ALTER TABLE `table_name`
MODIFY COLUMN `field_name` tinyint UNSIGNED ;
10、排序:把user_id 为45的数据,放在最前边
ORDER BY
CASE WHEN fn.user_id=45 THEN 1 END DESC,
`count` DESC
11、排序:把user_id 为45的数据,放在最后边
ORDER BY
FIELD(user_id, 45),
`count` DESC