一、子查询   

子查询:把一个查询语句用括号括起来,当做另外一条查询语句的条件去用,称为子查询

select emp.name from emp inner join dep on emp.dep_id = dep.id where dep.name="技术";

select name from emp where dep_id =
(select id from dep where name="技术");

查询平均年龄在25岁以上的部门名
select name from dep where id in
(select dep_id from emp group by dep_id having avg(age) > 25);

select dep.name from emp inner join dep on emp.dep_id = dep.id
group by dep.name
having avg(age) > 25;

查看不足2人的部门名(子查询得到的是有人的部门id)

   

  补:exists存在

select * from emp where exists (
select id from dep where id > 3
);

查询每个部门最新入职的那位员工

select t1.id,t1.name,t1.post,t1.hire_date,t2.post,t2.max_date from emp as t1 inner join
(select post,max(hire_date) as max_date from emp group by post) as t2
on t1.post = t2.post
where t1.hire_date = t2.max_date
;

二、pymysql模块

基本操作之查询:  

import pymysql #pip3 install pymysql

conn=pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='123',
database='db42',
charset='utf8'
)
cursor=conn.cursor(pymysql.cursors.DictCursor) #查询结果以字典形式显示 sql='select * from class;'
rows=cursor.execute(sql) #执行一条sql语句,返回值是执行结果的行数
print(rows) print(cursor.fetchone()) #取出一行执行结果,光标向后移动一位
print(cursor.fetchone()) #取出第二行执行结果 光标向后移动一位
print(cursor.fetchmany(2)) #取出两行执行结果 光标向后移动两位
print(cursor.fetchall()) #取出剩余的全部
print(cursor.fetchall()) # print(cursor.fetchall())
# cursor.scroll(3,'absolute') # 绝对路径 光标从最开始的位置开始向后移动3个位置
# print(cursor.fetchone()) #取出当前光标所在位置的数据,并将光标后移 print(cursor.fetchone())
print(cursor.fetchone())
cursor.scroll(1,'relative') #相对路径 光标从当前位置开始向后移动3个位置
print(cursor.fetchone()) conn.commint() #提交事务
cursor.close()
conn.close()

  基本操作之增改:

import pymysql #pip3 install pymysql

conn=pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='123',
database='db42',
charset='utf8'
)
cursor=conn.cursor(pymysql.cursors.DictCursor) #一次插入一行记录
sql='insert into user(username,password) values(%s,%s)'
rows=cursor.execute(sql,('EGON','123456'))
print(rows)
print(cursor.lastrowid) rows=cursor.execute('update user set username="alexSB" where id=2')
print(rows) # 一次插入多行记录
sql='insert into user(username,password) values(%s,%s)'
rows=cursor.executemany(sql,[('lwz','123'),('evia','455'),('lsd','333')])
print(rows)
print(cursor.lastrowid) conn.commit() # 只有commit提交才会完成真正的修改
cursor.close()
conn.close()

三、防止sql注入问题 

1、当输入 正确的用户名 并在其后加上 '--' sql注释符时, 我们执行这条sql 后边的密码验证判断就被注释掉了,从而没有密码就可以登录

2、 或者 在用户输入用户名时,随意输入用户名 并加上 'or 1=1' 这种语句,则跳过了账户密码的验证直接登陆进去了

所以rows=cursor.execute(sql)这种拼接sql ,直接执行的方法并不可靠   

import pymysql #pip3 install pymysql

conn=pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='123',
database='db42',
charset='utf8'
)
cursor=conn.cursor(pymysql.cursors.DictCursor) inp_user=input('用户名>>:').strip() #inp_user=""
inp_pwd=input('密码>>:').strip() #inp_pwd=""
sql="select * from user where username='%s' and password='%s'" %(inp_user,inp_pwd) #1、当输入 正确的用户名 并在其后加上 '--' sql注释符时, 我们执行这条sql 后边的密码验证判断就被注释掉了,从而没有密码就可以登录
#2、 或者 在用户输入用户名时,随意输入用户名 并加上 'or 1=1' 这种语句,则跳过了账户密码的验证直接登陆进去了 rows=cursor.execute(sql) #所以这种拼接sql ,直接执行的方法并不可靠
if rows:
print('登录成功')
else:
print('登录失败') cursor.close()
conn.close()

  解决办法:

pymysql 为我们提供了过滤字符串中特殊符号的功能

  使用如下方法传入参数,会自动帮我们过滤掉特殊字符,防止sql注入  

inp_user=input('用户名>>:').strip() #inp_user=""
inp_pwd=input('密码>>:').strip() #inp_pwd=""
sql="select * from user where username=%s and password=%s" rows=cursor.execute(sql,(inp_user,inp_pwd))

5月11日 python学习总结 子查询、pymysql模块增删改查、防止sql注入问题的更多相关文章

  1. 4月11日 python学习总结 对象与类

    1.类的定义 #类的定义 class 类名: 属性='xxx' def __init__(self): self.name='enon' self.age=18 def other_func: pas ...

  2. 6月11日 python学习总结 框架理论

    Web框架本质及第一个Django实例   Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web ...

  3. 4月19日 python学习总结 套接字模块的使用

    服务端: import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 买电话 phone.bind(('127.0.0 ...

  4. python学习之列表的定义以及增删改查

    列表定义: >>> name['lily','lucy','tom'] >>> nums = [11,22,33,'100','lily'] #python中的列表 ...

  5. mysql python pymysql模块 增删改查 插入数据 介绍 commit() execute() executemany() 函数

    import pymysql mysql_host = '192.168.0.106' port = 3306 mysql_user = 'root' mysql_pwd = ' encoding = ...

  6. mysql python pymysql模块 增删改查 查询 fetchone

    import pymysql mysql_host = '192.168.0.106' port = 3306 mysql_user = 'root' mysql_pwd = ' encoding = ...

  7. mysql python pymysql模块 增删改查 查询 字典游标显示

    我们看到取得结果是一个元祖,但是不知道是哪个字段的,如果字段多的时候,就比较麻烦 ''' (1, 'mike', '123') (2, 'jack', '456') ''' 用字典显示查询的结果,也可 ...

  8. mysql python pymysql模块 增删改查 查询 fetchmany fetchall函数

    查询的fetchmany fetchall函数 import pymysql mysql_host = '192.168.0.106' port = 3306 mysql_user = 'root' ...

  9. python链接oracle数据库以及数据库的增删改查实例

    初次使用python链接oracle,所以想记录下我遇到的问题,便于向我这样初次尝试的朋友能够快速的配置好环境进入开发环节. 1.首先,python链接oracle数据库需要配置好环境. 我的相关环境 ...

随机推荐

  1. netstat 竟然还能这么玩儿?

    一次摸鱼的机会,看到群里小伙伴问了一嘴 netstat -tnpl 这个命令是干啥的,这个命令用过很多,但是我其实也没有认真研究过,但是这是一个问题,我不能放过它,而且 netstat 这个命令我日常 ...

  2. SpringCloud--feign的配置加载

    spring cloud feign我们使用 @FeignClient注解,其中有几个核心属性: @AliasFor("name") String value() default ...

  3. SpringMVC 解析(三) Controller 注解

    我在前面的文章中介绍了Spring MVC最核心的组件DispatcherServlet,DispatcherServlet把Servlet容器(如Tomcat)中的请求和Spring中的组件联系到一 ...

  4. Solution -「BZOJ 3812」主旋律

    \(\mathcal{Description}\)   Link.   给定含 \(n\) 个点 \(m\) 条边的简单有向图 \(G=(V,E)\),求 \(H=(V,E'\subseteq E)\ ...

  5. 5道面试题,拿捏String底层原理!

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. String字符串是我们日常工作中常用的一个类,在面试中也是高频考点,这里Hydra精心总结了一波常见但也有点烧脑的String面试题,一共5道 ...

  6. 这个杀手不太冷-kill家族

    文章目录 kill killall pkill 跑路小技巧 kill家族: kill: # 删除执行中的程序或工作 killall: # 使用进程的名称来杀死进程,使用此指令可以杀死一组同名进程 pk ...

  7. Dubbo SPI机制之三Adaptive自适应功能

    JDK标准中SPI机制的一个问题就是其一次性实例化扩展点所有实现,如果有扩展实现初始化很耗时,但如果没用上也加载,会很浪费资源:扩展点加载失败,其他扩展点都用不了了.Dubbo是如何解决该问题动态的选 ...

  8. Linux系统最重要的工具——Shell学习笔记

    一.为什么学习Shell脚本语言 1.Shell脚本语言是实现Linux/UNIX系统管理及自动化运维必备的重要工具,Linux/UNIX系统底层及 基础应用软件的核心大都涉及Shell脚本的内容. ...

  9. Chapter03 Java变量

    Chapter03 变量 目录 Chapter03 变量 3.1 为什么需要变量 3.1.1 一个程序就是一个世界 3.1.2 变量是程序的基本组成单位 3.1.3 简单原理图 3.2 变(变化)量( ...

  10. LeetCode-092-反转链表 II

    反转链表 II 题目描述:给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right .请你反转从位置 left 到位置 right 的链表节点,返回 ...