今日内容概要
今日内容详细
""" 一开始学习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 """ 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())
""" 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注入产生的原因及解决方案 了解 """