• day06--Navicat可视化界面/数据库查询题目讲解(多表操作)/pymysql模块-sql注入以及解决办法


    一:连表查询复习

    题目:查询平均年纪在25岁以上的部门名称
    
    #只要是多表查询就有两种方法 连表和子查询
    
    方法1:连表
    select depart.name from depart inner join emplo on emplo.dep_id =depart.id  group by depart.name  having avg(age)>25;
    
    +--------------+
    | name         |
    +--------------+
    | 人力资源     |
    | 销售         |
    +--------------+
    
    
    方法2:子查询
    select name from depart where id in (select dep_id from emplo group by dep_id having avg(age)>25);
    
    +--------------+
    | name         |
    +--------------+
    | 人力资源     |
    | 销售         |
    +--------------+

    二:Navicat可视化界面 

    1.使用技巧和注意事项

    (1)外键的添加是用空格

     (2)运行和转储SQL文件,逆向数据库到模型

     运行和转储SQL文件:是将外部的打开或者转存出去;逆向数据库到模型:呈现出表和表关系

    (3)添加外键

    右键表名--设计表--添加外键--选择即可

    (4)自己写sql语句

    注释是ctrl+?   右键选中 命令单独运行命令 

    三:pymysql模块

    (1)pymysql的安装  

    cmd管理员打开后--输入pip3 install pymysql     确认安装成功的话在python中输入 import pymysql 就可确认

    (2)pymysql 在py中的使用

    import pymysql
    #链接数据库
    conn=pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        password='123',
        charset='utf8',
        database='db1'
    )
    cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)    #产生一个游标对象,用来帮我们执行命令的,括号内是查询结果以字典的方式返回
    sql='select *from emp;'
    res=cursor.execute(sql)                                  #此条必须输入
    print(res)   #返回的是你当前sql语句的行数
    print(cursor.fetchone())   #只返回一条
    print(cursor.fetchall())  #返回所有的
    print(cursor.fetchmany(2))  #可以指定拿几条,结果是空的,类似于文件的光标,此时文件光标在最后,所以内容是空的 

    (3)sql注入以及解决办法

    import pymysql
    #链接数据库
    
    conn=pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        password='123',
        charset='utf8',
        database='db1'
    )
    cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)    #产生一个游标对象,用来帮我们执行命令的,括号内是查询结果以字典的方式返回
    
    username=input('>>>')
    password=input('>>>')
    
    sql='select *from user where name=%s and password=%s'
    #不要手动的去拼接数据,先用%s进行占位,之后需要拼接数据直接交给 execute 方法即可
    print(sql)
    
    rows=cursor.execute(sql,(username,password))
    
    if rows:
        print('登录成功')
        print(cursor.fetchall())
    else:
        print('用户名密码错误')

    (4)对mysql的 增 删 改

    import pymysql
    #链接数据库
    改:
    conn=pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        password='123',
        charset='utf8',
        database='db1',
        autocommit=True
    )
    cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)    #产生一个游标对象,用来帮我们执行命令的,括号内是查询结果以字典的方式返回
    
    sql="update emplo set name='zz' where id=1;"
    print(cursor.execute(sql))

    增:
    单个的增加
    cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)    #产生一个游标对象,用来帮我们执行命令的,括号内是查询结果以字典的方式返回

    sql="insert emplo values(7,'mm','male',19,201)"
    print(cursor.execute(sql))

    多个的
    cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)    #产生一个游标对象,用来帮我们执行命令的,括号内是查询结果以字典的方式返回

    sql="insert emplo(name,password) values(%s,%s)"
    rows=cursor.executemany(sql,[('zz',123),('mm',456)])
    print(rows)
     
  • 相关阅读:
    String驻留带来的危害
    Go语言的堆栈分析
    SecureCRT使用技巧
    Javascript中相同Function使用多个名称
    记录Office Add-in开发经验
    Silverlight和WPF中DataContractJsonSerializer对时间的处理差异
    ASP.NET MVC项目实践技巧
    有点担心Node.js的未来了
    回首经典的SQL Server 2005
    duilib关于学习Demo中的QQ
  • 原文地址:https://www.cnblogs.com/dayday-up-a/p/14444238.html
Copyright © 2020-2023  润新知