一些常用的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
posted @ 2021-03-19 11:44  做个笔记  阅读(296)  评论(0编辑  收藏  举报