关于sql语法

之前在写网页的时候接触了一下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语句,还需多加学习

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注