• day48 navicat使用及pymysql的使用


    一、navicat介绍

    navicat是一个能够方便我们用更简单的方式操作数据库的工具

    1 基本使用

    创建连接,然后创建库,创建表,写字段都是一些常规操作,如果要进一步了解数据库,去看模型,也可以自动生成sql语句

    2 练习题

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

    SELECT
    	course.cname,
    	teacher.tname
    FROM
    	course
    JOIN teacher ON course.teacher_id = teacher.tid;
    

    2.2 查询平均成绩大于八十分的同学的姓名和平均成绩

    SELECT
    	student.sname,
    	avg(score.num)
    FROM
    	student
    JOIN score ON student.sid = score.student_id
    GROUP BY
    	score.student_id
    HAVING
    	avg(num) > 80
    

    2.3 查询没有报李平老师课的学生姓名

    SELECT
    	student.sname
    FROM
    	student
    WHERE
    	student.sid NOT IN (
    		SELECT
    			student_id
    		FROM
    			score
    		where score.course_id in(SELECT
    						course.cid
    					FROM
    						teacher
    					INNER JOIN course ON teacher.tid = course.teacher_id
    					WHERE
    						teacher.tname = '李平老师' )
    	) ;
    

    2.4 查询没有同时选修物理课程和体育课程的学生姓名

    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
    				score.student_id
    			HAVING
    				COUNT(score.student_id) = 1
    		)
    	);
    

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

    SELECT
    	student.sname,
    	class.caption
    FROM
    	student
    JOIN class ON student.class_id = class.cid
    WHERE
    	student.sid IN (
    		SELECT
    			score.student_id
    		FROM
    			score
    		HAVING
    			COUNT(score.num < 60) >= 2
    	);
    
    

    二、pymysql模块

    pymysql是python中通过python语句对数据库进行操作的模块

    pip3 install pymysql 导入模块

    基本使用

    import pymysql
    
    conn = pymysql.connect(
        host = '127.0.0.1',
        port = 3306,
        user = 'root',
        password = 'root',
        database = 'day46', # 指定我们要编写的库
        charset = 'utf8'# 不能写成utf-8
    ) # 链接数据库
    
    cursor = conn.cursor() # 产生一个游标对象,相当于我们已经链接mysql正在准备输入指令 通常不使用
    cursor = conn.cursor(cursor=pymysql.cursors.Dictcursor) # 通常使用这一种,获取数据更明确
    sql = 'select * from teacher;'
    res = cursor.execute(sql)
    # execute 返回的是当前sql语句得到数据的行数 通常不用
    # print(cursor.fetchone()) # 得到一条数据
    # print(cursor.fetchmany(res)) # 得到全部
    # print(cursor.fetchmany()) # 不指定时得到一个数据
    print(cursor.fetchall()) # 得到全部数据
    cursor.scroll(1,'relative') # 相对当前运动 相对于光标向后移动一个单位,等于跳过下一个数据
    cursor.scroll(1,'absolute') # 相对开头运动 相对于开头运动一个单位,光标从这开始
    

    三、sql注入

    当我们需要让用户去写一些sql代码时,比如说以用户输入的信息去数据库中搜索,如果用户输入的是一些可以操作数据库的代码,就会造成sql注入

    # 登录功能
    import pymysql
    
    conn = pymysql.connect(
        host = '127.0.0.1',
        port = 3306,
        user = 'root',
        password = '123456',
        database = 'day48',
        charset = 'utf8'  # 编码千万不要加-
    )  # 链接数据库
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    
    username = input('>>>:')
    password = input('>>>:')
    sql = "select * from user where name=%s and password=%s",%(username,passowrd)
     
    if rows:
        print('登录成功')
        print(cursor.fetchall())
    else:
        print('用户名密码错误')
        
    # 如果我们在输入用户名的时候输入 -- 相当于mysql中的注释,直接把密码搜索注释掉了,就不用验证了
    """
    利用一些语法的特性 书写一些特点的语句实现固定的语法
    MySQL利用的是MySQL的注释语法
    select * from user where name='jason' -- jhsadklsajdkla' and password=''
    
    select * from user where name='xxx' or 1=1 -- sakjdkljakldjasl' and password=''
    """
    

    总结:利用一些语法的特性 书写一些特点的语句实现固定的语法
    MySQL利用的是MySQL的注释语法

    sql注入解决方法

    #日常生活中很多软件在注册的时候都不能含有特殊符号
    #因为怕你构造出特定的语句入侵数据库 不安全
    
    # 敏感的数据不要自己做拼接 交给execute帮你拼接即可
    # 结合数据库完成一个用户的登录功能?
    import pymysql
    
    
    conn = pymysql.connect(
        host = '127.0.0.1',
        port = 3306,
        user = 'root',
        password = '123456',
        database = 'day48',
        charset = 'utf8'  # 编码千万不要加-
    )  # 链接数据库
    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))  # 自动识别sql里面的%s用后面元组里面的数据替换
    if rows:
        print('登录成功')
        print(cursor.fetchall())
    else:
        print('用户名密码错误')
    
  • 相关阅读:
    lyt经典版MySQL基础——进阶6:连接查询-sql92语法-内连接
    lyt经典版MySQL基础——进阶4:常见函数-分组函数
    lyt经典版MySQL基础——进阶2:条件查询
    lyt经典版MySQL基础——进阶1:基础查询
    【转】jmeter如何设置登录接口只调用一次以及遇到的问题:cookie参数放在消息头headers里面
    Kafka命令行操作
    git上无法push代码解决办法
    【转】Jenkins集成Docker镜像实现自动发布
    springboot从一个Controller中的方法跳转到另一个Controller中的方法
    window.open
  • 原文地址:https://www.cnblogs.com/hz2lxt/p/12843218.html
Copyright © 2020-2023  润新知