之前在写网页的时候接触了一下sql,感觉语句还是挺简洁的,这里来梳理一下
ps:以下有些名词为自己命名,没有查官方文档
首先,要先摆出一个操作关键字,然后选中目标(目标可能还有一些筛选条件)
选中SELECT *(全部)/某些字段名 From 表名
插入INSERT INTO 表名 (所有要填入的字段名) VALUES (对应的值)
更新UPDATE 表名 SET 字段名=操作
删除DELETE FROM 表名
在结尾加上WHERE 字段名='xxx' AND …… 的句式即可筛选出需要做出操作的行
在最近写的一个函数中,把这些操作都做了一遍,贴上来做一个范例:
def key2list(self, Name, add_del): sql1 = "SELECT `number` FROM `game_list` WHERE\ `username` = '%s' AND `name` = '%s'" #查询 sql2 = "UPDATE `game_list` SET `number`=`number`+1 WHERE\ `username` = '%s' AND `name` = '%s'" #自加 sql3 = "INSERT INTO `game_list`(`username`, `name`) VALUES ('%s', '%s')" #添加 sql4 = "UPDATE `game_list` SET `number`=`number`-1 WHERE\ `username` = '%s' AND `name` = '%s'" #自减 sql5 = "DELETE FROM `game_list` WHERE `username` = '%s' AND `name` = '%s'" #删除 try: #找到用户名下此游戏的数量 self.cursor.execute(sql1 % (self.username, Name)) results = self.cursor.fetchall() except Exception as e: print(e) if add_del == 0: #添加一个key if len(list(results)) != 0: #在库中有此游戏 sql = sql2 else: sql = sql3 else: #减少一个key if results[0][0] > 1: #库存不止一个key sql = sql4 else: sql = sql5 try: self.cursor.execute(sql % (self.username, Name)) self.db.commit() except Exception as e: print(e) finally: self.db.close()
当然,sql语句不止这些简单句式,他还有一个非常强大的CASE,我刚上手,只理解了一点点,用case优化了之前的一个繁琐过程,现在结合这个优化看一下
这个函数需要实现的功能是:获取所有行的游戏名与价格并以字典列表的形式返回,但是当价格为-1时,字典中需要存入'暂无'而非将-1写进去
当我刚开始写的时候,不知道case功能,用python解决
sql语句
SELECT `name`, `number`, `current_price`, `lowest_price`\ FROM `game_list` WHERE `username` = '%s'
sql只是原原本本的将我要的数据返回到了python中,然后我遍历了数据,将价格字段中的-1修改为了'暂无'
缺点显而易见:语句繁琐,系统开销大
后来我看到了case,将sql修改成了这样:
select `name`, `number`, (CASE WHEN `current_price`='-1'\ THEN '暂无' ELSE `current_price` END) as current_price_text, \ (CASE WHEN `lowest_price`='-1' THEN '暂无' ELSE `lowest_price` END)\ as lowest_text from game_list WHERE `username` = '%s'
乍一看sql很长,但其实就是多了两个case,而且似乎不用注释都能看懂啥意思
这样返回python之后,省去了轮询替换的过程,从代码简洁与系统开销方面都强上不少
case还有一些语句就比较复杂,萌新表示不太看得懂大神们写的最优sql语句,还需多加学习