四十八、Navicat使用、pymysql模块使用、SQL注入问题

今日内容概要

今日内容详细

  • Navicat软件
"""
一开始学习Python的时候,下载Python解释器然后直接在终端写Python语句,
pycharm能够更方便快捷的帮助我们书写python代码

excle  word  pdf
我们在终端操作mysql也没有自动提示,也无法保存等等,不方便开发
Navicat内部封装了所有的操作数据库的命令
用户在使用它的时候,只需要鼠标点点点就可以完成操作,无需书写SQL语句
"""

    安装

 

使用下列的网址中的步骤即可完成操作
https://www.cnblogs.com/zero-vic/p/12786660.html
    如果想用正式版,到期后自己再重新    安装就好了
    
Navicat能够充当多个数据的客户端

 

    使用

utf8mb4字符集可以存储表情
创建好表之后,添加字段时,如果指定字段为主键,一定要选择自动递增,如果忘记了也无所谓
Navicat图形化界面有时候反应速度比较慢,你可以选择刷新或者关闭当前窗口重新打开
当你有一些需求,该软件无法满足的时候,你就自己动手写SQL语句

    提示

# 1.MySQL是不区分大小写的
    忽略大小写  
        验证码忽略
            内部统一转成大写或者小写即可
                upper()
                lower()

# 2.mysql建议所有的关键字大写


# 3.MySQL的注释有两种 __
                                    #

# 4.navicat中如何快速注释和解注释
    
        ctrl + ? 加注释,再按一次就可以解开注释
        版本较老的用的ctrl + shift + ? 解开注释
  • 数据库查询题目讲解(多表操作)
"""
1.查询所有的课程的名称以及对应的任课老师姓名
4.查询平均成绩大于80分的同学的姓名和平均成绩
7.查询没有报李萍老师课的学生姓名
8.查询没有同时选修物理课程和体育课程的学生姓名
9.查询挂科超过两门(包括两门)的学生姓名和班级
"""

#1.查询所有的课程的名称以及对应的任课老师姓名

select course.cname,teacher.tname from course inner join teacher on course.teacher_id = teacher.tid;


#4.查询平均成绩大于80分的同学的姓名和平均成绩
SELECT
    student.sname,
    t1.avg_num 
FROM
    student
    INNER JOIN ( SELECT score.student_id, AVG( num ) AS avg_num FROM score GROUP BY score.student_id HAVING avg( num ) > 80 ) AS t1 ON student.sid = t1.student_id;

-- 7.查询没有报李萍老师课的学生姓名
#分步操作
--     1.先找到李平老师教授的课程id
--     2.再找所有报了李平老师课程的学生id
--     3.之后再去学生表里取反,就可以获取没有报李萍老师课程的学生姓名
SELECT
    student.sname 
FROM
    student 
WHERE
    student.sid NOT IN (
    SELECT DISTINCT
        score.student_id 
    FROM
        score 
    WHERE
    score.course_id IN ( SELECT course.cid FROM course INNER JOIN teacher ON course.teacher_id = teacher.tid WHERE teacher.tname = '李平老师' ));

#8.查询没有同时选修物理课程和体育课程的学生姓名
# 方法1:
-- SELECT
--     student.sname 
-- FROM
--     student 
-- WHERE
--     student.sid IN (
--     SELECT
--         score.student_id 
--     FROM
--         score
--         INNER JOIN course ON score.course_id = course.cid 
--     WHERE
--         course.cname IN ( "物理", "体育" ) 
--     GROUP BY
--         score.student_id 
--     HAVING
--         COUNT( score.student_id ) = 1 
--     );

# 方法2:
SELECT
    student.sname 
FROM
    student 
WHERE
    student.sid IN (
    SELECT
        score.student_id 
    FROM
        score 
    WHERE
        score.course_id IN (
        SELECT
            course.cid 
        FROM
            course 
        WHERE
        course.cname IN ( '物理', '体育' )) 
    GROUP BY
        student_id 
    HAVING
        COUNT( student_id ) = 1 
    );

#9.查询挂科超过两门(包括两门)的学生姓名和班级

SELECT
    student.sname,
    class.caption 
FROM
    class
    INNER JOIN student ON class.cid = student.class_id 
WHERE
    student.sid IN ( SELECT score.student_id FROM score WHERE score.num < 60 GROUP BY student_id HAVING COUNT( student_id ) >= 2 );
  • python如何操作MySQL(pymysql模块)
"""
支持Python代码操作数据库MySQL
"""


import pymysql

conn = pymysql.connect(
    host = '127.0.0.1',
    port = 3306,
    user = 'root',
    password = '123',
    database = 'day48',
    charset = 'utf8'
)    

cursor = conn.cursor(cursor = pymysql.cursors.DictCursor)    #产生一个游标对象

"""
cursor = pymysql.cursors.DictCursor   将查询结果以字典的形式返回
"""

sql = 'select * from teacher;'
res = cursor.execute(sql)    

print(res)    #execute返回的是你当前sql语句所影响的行数,该返回值一般不用

#获取命令执行的查询结果
print(cursor.fetchone())    #只拿一条结果
print(cursor.fetchall())    #拿所有
print(cursor.fetchmany(4))    #拿括号中指定的条数

print(cursor.fetchone())
print(cursor.fetchone())    #读取文件类似于文件的光标的移动
# cursor.scroll(1,'relative') #相对于光标所在的位置继续往后移动一位
cursor.scroll(1,'absolute') #相对于数据的开头往后移动一位
print(cursor.fetchall())

    SQL注入问题

 

"""
l利用一些语法的特性,书写一些特殊的语句实现固定的语法

MySQL利用的是MySQL的注释语句
日常生活中,很多软件注册时候,都不能含有特殊符号,因为怕你构造出特定的语句入侵数据造成不安全

敏感的数据,不要自己作拼接,交给excute方法即可
"""

# 版本一、存在的问题 ,当用户这样输入的时候,也能登陆成功

"""
>>>>>>:jason' -- ajskdf;
>>>>>>:
登陆成功
[{'id': 8, 'name': 'jason', 'password': '123'}]

Process finished with exit code 0

或者这样

>>>>>>:xxx' or 1=1 -- fajdkf;adj
>>>>>>:
登陆成功
[{'id': 2, 'name': 'egon', 'password': '123'}, {'id': 3, 'name': 'owen', 'password': '123'}, {'id': 4, 'name': 'jasonNB', 'password': '123'}, {'id': 5, 'name': 'jack', 'password': '123'}, {'id': 6, 'name': 'liili', 'password': '123'}, {'id': 8, 'name': 'jason', 'password': '123'}, {'id': 9, 'name': 'xxx', 'password': '132'}, {'id': 10, 'name': 'ooo', 'password': '123'}, {'id': 11, 'name': 'aaa', 'password': '132'}]


#以上现象就是SQL注入问题:
"""

import pymysql

conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    passwd='123',
    database='day48',
    charset='utf8'
)

cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
username = input('>>>>>>:').strip()
password = input('>>>>>>:').strip()
sql = "select * from user where name='%s' and password='%s'" %(username,password)

rows = cursor.execute(sql)
if rows:
    print('登陆成功')
    print(cursor.fetchall())
else:
    print('账号密码错误')

#版本二:解决方案,不要拼接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    passwd='123',
    database='day 48',
    charset='utf8',
    autocommit=True
)

cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

while True:
    username = input('>>>>>:').strip()
    password = input('>>>>>:').strip()
    sql = 'select * from user where name=%s and password=%s'
    # 不要手动拼接,先用%s占位之后将需要拼接的数据交给excute方法即可
    rows = cursor.execute(sql,(username,password))
    if rows:
        print('登陆成功')
        print(cursor.fetchall())
        break
    else:
        print('账号密码错误,登录失败')

 

    总结

 

"""
1.Navicat自己玩一玩
2.练习题一定要自己敲会
3.熟悉pymysql模块
4.SQL注入产生的原因及解决方案 了解
"""

 

上一篇:clickhouse之python操作


下一篇:Python - 连接并操作 MySQL