Navcat 软件使用及 pymysql模块

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

安装

直接百度搜索 有破解版的也有非破解
非破解的有试用期 你如果不嫌麻烦 你就用使用
到期之后重新装再使用 或者破解一下也很简单
https://www.cr173.com/soft/126934.html
    
下载完成后是一个压缩包 直接解压 然后点击安装 有提醒直接点击next即可

navicat能够充当多个数据库的客户端


navicat图形化界面有时候反应速度较慢 你可以选择刷新或者关闭当前窗口再次打开即可

当你有一些需求该软件无法满足的时候 你就自己动手写sql

提示

"""
1 MySQL是不区分大小写的
	验证码忽略大小写
		内部统一转大写或者小写比较即可
			upper
			lower

2 MySQL建议所有的关键字写大写

3 MySQL中的注释 有两种
	--
	#

4 在navicat中如何快速的注释和解注释
	ctrl + ?  加注释
	ctrl + ?  基于上述操作再来一次就是解开注释
	如果你的navicat版本不一致还有可能是
	ctrl + shift + ?解开注释
"""

练习:

-- 1、查询所有的课程的名称以及对应的任课老师姓名
-- SELECT
-- 	course.cname,
-- 	teacher.tname 
-- FROM
-- 	course
-- 	INNER JOIN teacher ON course.teacher_id = teacher.tid;

-- 4、查询平均成绩大于八十分的同学的姓名和平均成绩
-- SELECT
-- 	student.sname,
-- 	t1.avg_num 
-- FROM
-- 	student
-- 	INNER JOIN (
-- 	SELECT
-- 		score.student_id,
-- 		avg( num ) AS avg_num 
-- 	FROM
-- 		score
-- 		INNER JOIN student ON score.student_id = student.sid 
-- 	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
-- 	sid NOT IN (
-- 	SELECT DISTINCT
-- 		score.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 = '李平老师' ) 
-- 	);

-- 8、 查询没有同时选修物理课程和体育课程的学生姓名
--     (只要选了一门的 选了两门和没有选的都不要)
# 1 先查物理和体育课程的id
# 2 再去获取所有选了物理和体育的学生数据
# 3 按照学生分组 利用聚合函数count筛选出只选了一门的学生id
# 4 依旧id获取学生姓名
-- 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.course_id ) = 1 
-- 	);

-- 9、 查询挂科超过两门(包括两门)的学生姓名和班级
# 1 先筛选出所有分数小于60的数据
# 2 按照学生分组 对数据进行计数获取大于等于2的数据
SELECT
	class.caption,
	student.sname 
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 score.student_id HAVING COUNT( score.course_id ) >= 2 
	);

pymysql 模块

pymysql模块支持 python代码操作数据 MySQL

pip3 install pymysql

使用

# coding:utf-8
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) #产生一个游标对象(用来执行 sql 命令的)
# print(cursor) #<pymysql.cursors.DictCursor object at 0x10b2a70b8>
'''
cursor=pymysql.cursors.DictCursor 将查询结果以字典的形式或列表套字典形式返回
'''
sql = 'select * from teacher;'
res = cursor.execute(sql) #execute 返回的是当前 sql语句所影响的行数,该返回值一般不用
# print(res) #5 即返回 5 条记录,如果 sql

#获取命令执行的查询结果
'''
cursor.fetchone():只拿一条记录
cursor.fetchmany(数字):指定拿多少条记录
cursor.fetchall():拿所有记录
'''
#此时游标对象处于表的第一条记录之前
# print(cursor.fetchone()) #{'tid': 1, 'tname': '张磊老师'} 拿到第一条记录
# #此时游标对象已移动至第一条表的记录之后,第二条件记录之前
# print(cursor.fetchone()) #返回值以字典形式:{'tid': 2, 'tname': '李平老师'} 拿到第二条记录
# #此是游标对象已移动至第二条记录之后,第三条记录之前
# print(cursor.fetchmany(2)) #返回值以列表套字典形式:[{'tid': 3, 'tname': '刘海燕老师'}, {'tid': 4, 'tname': '朱云海老师'}]

#拿表的所有记录
# print(cursor.fetchall()) #返回值以列表套字典形式:[{'tid': 1, 'tname': '张磊老师'}, {'tid': 2, 'tname': '李平老师'},
# {'tid': 3, 'tname': '刘海燕老师'},
# {'tid': 4, 'tname': '朱云海老师'}, {'tid': 5, 'tname': '李杰老师'}]

# ps:读取记录时需要根据光标所处位置,当读取数据后,光标也会移动位置

#相对位置移动
cursor.scroll(1, 'relative') #相对于当前光标所处位置,继续往后移动1位
print(cursor.fetchone()) #{'tid': 2, 'tname': '李平老师'}

#绝对位置移动
cursor.scroll(3, 'absolute') #即从表记录的起始位置,继续往后移动3位
print(cursor.fetchone()) #{'tid': 4, 'tname': '朱云海老师'}

sql注入问题

# coding:utf-8
import pymysql

#1、定制连接配置
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    database='day48',
    charset='utf8' #编码千万不要加-
)

#2、产生游标对象
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
username=input('>>>:')
password=input('>>>:')

#3、定制 sql语句
# sql = "select * from userinfo where name='%s' and password='%s'"%(username, password) #错误用法,会造成 sql注入问题
# print(sql)
# rows = cursor.execute(sql)
'''
sql 注入问题:
利用一些语法的特性,书写一些特点的语句实现固定的语法,也会通过where筛选。
这里利用的技术MySQL的注释语法
示例:
select * from user where name='jason' -- jhsadklsajdkla' and password=''

select * from user where name='xxx' or 1=1 -- sakjdkljakldjasl' and password=''
'''

#解决sql注入的方法:敏感的数据不要自己做拼接 交给execute帮你拼接即可
#注:不要手动拼接数据 先用%s占位 之后将需要拼接的数据直接交给execute方法即可
sql = "select * from userinfo where name=%s and password=%s"

#4、通过游标对象的执行方法执行 sql语句
rows = cursor.execute(sql, (username, password)) #自动识别 sql里面的%s,h会用后面元组里面的数据替换

#5、判断
if rows: #如果游标对象返回记录,说明用户名和密码筛选成功
    print('登录成功')
    print(cursor.fetchall()) #[{'name': 'han', 'password': '123', 'id': 1}]
else: #如果游标对象没有返回李璐,说明用户名或密码错误
    print('用户名或密码错误')
posted @ 2020-05-07 23:24  蛋蛋的丶夜  阅读(239)  评论(0编辑  收藏  举报